日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java 获取所有带指定注解的类名_SXT DAY023 反射和注解

發布時間:2024/7/23 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 获取所有带指定注解的类名_SXT DAY023 反射和注解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 反射機制介紹_Class對象獲取

反射機制是 Java 的動態性之一

動態語言:在程序運行時,可以改變程序的結構或變量的 類型。

反射機制的常見作用

  • 動態的加載類、動態的獲取類的信息(屬性,方法,構造 器)
  • 動態構造對象
  • 動態調用類和對象的任意方法、構造器
  • 動態調用和處理屬性
  • 獲取泛型信息
  • 處理注解
  • java.lang.Class類 :表示正在運行的Java應用程序中的類和接口

    獲取Class對象的方式

  • Class.forName(全限定類名);全限定類名==>包名+類名
  • 類名.class
  • 對象名.getClass()
  • 練習代碼

    public class Test {public static void main(String[] args) {//獲取Class對象try {//方法1:Class.forName("包名+類名")Class clazz=Class.forName("com.sxt.reflect.User");//方法2:類名.clazz // Class clazz=User.class;//方法3:通過調用 對象名.getClass()方法獲取該類的Class信息 // User user=new User(); // Class clazz=user.getClass();String name=clazz.getName(); //獲取類或接口的名稱System.out.println("名稱:"+name);String simpleName=clazz.getSimpleName();System.out.println("簡單類名:"+simpleName);//獲取聲明的屬性信息System.out.println("*****************屬性信息******************");Field[] fields=clazz.getDeclaredFields(); //Field類封裝了屬性信息for (Field field : fields) {int fieldModifier=field.getModifiers();//獲取修飾符 0:默認 1:private 2:public 4:protectedClass fieldType=field.getType();//獲取類型String fieldName=field.getName();//獲取名稱System.out.println(fieldModifier+"----"+fieldType+"----"+fieldName); }//獲取構造方法System.out.println("**************構造方法****************");Constructor[] constructors=clazz.getDeclaredConstructors(); //獲取構造器for (Constructor constructor : constructors) {int cModifier=constructor.getModifiers(); //獲取構造器的修飾符String cName=constructor.getName();Class[] cs=constructor.getParameterTypes();System.out.println(cModifier+"---"+cName+"---"+Arrays.toString(cs)); }//獲取方法信息System.out.println("***************方法信息***************");Method[] methods=clazz.getDeclaredMethods();for (Method method : methods) {int mModifier=method.getModifiers();Class returnType=method.getReturnType(); //獲取返回值類型String mName=method.getName(); //獲取方法名Class[] cs=method.getParameterTypes();System.out.println(mModifier+"---"+returnType+"---"+mName+"---"+Arrays.toString(cs));}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

    運行結果

    2 反射機制動態操作方法_屬性_構造器

    獲取類的名字的方法

    • String getName() 獲得全限定類名 包名+類名
    • String getSimpleName() 獲得簡單類名

    獲得類的屬性的方法

    • Field getField(String fieldName) 得到公共的屬性 對象
    • Field getDeclareField(String fieldName) 得到指定名稱的 屬性對象
    • Field []c.getDeclaredFields() 得到所有的屬性 對象

    獲得類的方法

    • Method[] getDeclaredMethods() 得到所有聲明的公共的方法對象
    • Method[] c.getMethods() 得到父類及本類中的公共的方法對象
    • Method getDeclaredMethod(String methodName, Class …type) 得到指定名稱的 本類中公共的方法
    • Method getMethod(String methodName, Class type) 得到本類或父類中的公共的方法對象

    獲得構造方法

    • Constructor[] getDeclaredConstructors() 得到所有聲明的公共的構造方法的對象
    • Constructor[] getConstructors() 得到公共的構造方法對象
    • Constructor getDeclaredConstructor(Class...type) 得到指定參數的公共的構造方法對象

    練習代碼

    public class Test {public static void main(String[] args) throws Exception {String path="com.sxt.demo.User";//1.獲取類的名稱Class c=Class.forName(path);System.out.println("類的全名稱:"+c.getName());System.out.println("類的名稱:"+c.getSimpleName());//獲取父類的Class對象Class cSuper=c.getSuperclass();System.out.println(cSuper.getName());System.out.println(cSuper.getSimpleName());//3.獲取類的屬性信息 // Field f=c.getField("userId"); // 報錯 只能獲取公開的屬性 // System.out.println(f);Field[] fields=c.getFields(); //只能獲取公開的屬性System.out.println(fields.length);Field[] fields2=c.getDeclaredFields();System.out.println(fields2.length);for (Field field : fields2) { // System.out.println(field); //調用了toString()方法System.out.println(field.getModifiers()+"t"+field.getType()+"t"+field.getName());}//3.獲取類的方法信息Method[] methods=c.getDeclaredMethods(); //本類中的公共的方法對象System.out.println(methods.length);for (Method method : methods) { // System.out.println(method);System.out.println("訪問權限:"+method.getModifiers());System.out.println("返回值類型:"+method.getReturnType());System.out.println("方法的名稱:"+method.getName());//獲取方法的參數Class[] cPara=method.getParameterTypes();for (Class c1 : cPara) {System.out.println(c1.getTypeName()+"t");}System.out.println("--------------------------");}System.out.println("========================");//4.獲取類的構造器Constructor[] cons=c.getConstructors();for (Constructor constructor : cons) {System.out.println(constructor);}System.out.println("====================================");//根據參數獲取指定的構造方法Constructor con=c.getConstructor(null);System.out.println(con);System.out.println("====================================");Constructor con2=c.getConstructor(int.class,String.class,String.class);System.out.println(con2);} }

    運行結果

    練習代碼

    public class Test2 {public static void main(String[] args) {Class clazz;try {//如何動態創建對象clazz = Class.forName("com.sxt.reflect.User");Object object=clazz.newInstance();//通過反射動態創建對象System.out.println(object);System.out.println("------------訪問屬性---------------");Field userId=clazz.getDeclaredField("userId"); //獲取指定的屬性信息userId.setAccessible(true);userId.set(object, 1);//回調指定屬性的賦值---->user.userId=1Object value=userId.get(object);//回調指定屬性的getter方法進行賦值System.out.println("userId="+value);System.out.println("----------------回調方法---------------------");Method setUserName=clazz.getDeclaredMethod("setUserName", String.class);setUserName.invoke(object, "zhangsan"); //user.setUserName("zhangsan")Method getUserName=clazz.getDeclaredMethod("getUserName");//獲取getUserName方法Object returnValue=getUserName.invoke(object); //user.getUserName()System.out.println(returnValue);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

    運行結果

    3 提高反射效率

    通過 setAccessible 提高性能

    a) setAccessible 啟用和禁用訪問安全檢查的開關,值為 true 則指示反射的對象在使用時應該取消 Java 語言訪 問檢查,值為 false 則指示反射的對象不實施 Java 語 言訪問檢查,并不是為 true 就能訪問為 false 就不能訪問

    b) 禁止安全檢查,可以提高反射的運行速度

    練習代碼

    public class Test3 {//方法的直接調用public static void test(){Object obj=new Object();long startTime=System.currentTimeMillis();for(int i=0;i<1000000000L;i++){obj.hashCode();}long endTime=System.currentTimeMillis();System.out.println("直接調用 用時:"+(endTime-startTime));}//未優化 使用反射機制回調public static void test2() throws Exception{Object obj=new Object();Class clazz=obj.getClass();Method method=clazz.getDeclaredMethod("hashCode");long startTime=System.currentTimeMillis();for(int i=0;i<1000000000L;i++){method.invoke(obj);}long endTime=System.currentTimeMillis();System.out.println("未優化 使用反射機制回調 用時:"+(endTime-startTime));}//優化 使用反射機制回調public static void test3() throws Exception{Object obj=new Object();Class clazz=obj.getClass();Method method=clazz.getDeclaredMethod("hashCode");long startTime=System.currentTimeMillis();method.setAccessible(true);for(int i=0;i<1000000000L;i++){method.invoke(obj);}long endTime=System.currentTimeMillis();System.out.println("優化 使用反射機制回調 用時:"+(endTime-startTime));}public static void main(String[] args) throws Exception {test();test2();test3();}}

    運行結果

    4 反射操作泛型

    Java 中的泛型僅僅是給編譯器 javac 使用的,確保數據的安全性和免去強制類型轉換的麻煩,但是一旦編譯完成,所 有與泛型有關的類型全部擦除。

    使用泛型直接讀取泛型,是讀取不到的,因為反射是操作 加載以后的類的。

    Java新增的數據類型有

    • ParameterizedType: 表 示 一 種 參 數 化 的 類 型 ,比 如 Collection<String>,可以獲取 String 信息
    • GenericArrayType:泛型數組類型
    • TypeVariable:各種類型變量的公共父接口
    • WildcardType:代表一種通配符類型表達式, 比如? extends Number,? super Integer (Wildcard 是一個單詞,就是通配符)

    練習代碼

    public class TestGeneric {public void test01(Map<String,User>map,List<User>list,String s){System.out.println("TestGeneric.test01");}public Map<Integer,User> test02(){System.out.println("TestGeneric.test01");return null;}public void test03(){System.out.println("TestGeneric.test01");}public static void main(String[] args) throws Exception {//獲取test01方法的泛型參數信息NoSuchMethodExceptionClass c=TestGeneric.class;Method test01=c.getDeclaredMethod("test01", Map.class,List.class,String.class);//獲取帶泛型參數的類型Type[] types=test01.getGenericParameterTypes();System.out.println(types.length);for (Type type : types) {if(type instanceof ParameterizedType){ParameterizedType parameterizedType=(ParameterizedType) type;//ParameterizedType表示一個參數化類型Type[] genricType=parameterizedType.getActualTypeArguments();//返回一個表示此類型的實際類型參數的數組Type對象//遍歷每一個泛型參數中的泛型的類型for (Type genType : genricType) {System.out.println("泛型類型:"+genType);}System.out.println("-------------------");}}System.out.println("-------------------------");//獲取test01方法返回值的泛型信息Method test02=c.getDeclaredMethod("test02", null);Type returnType=test02.getGenericReturnType();//判斷是否帶有泛型if(returnType instanceof ParameterizedType){Type[] types2=((ParameterizedType)returnType).getActualTypeArguments();for (Type type : types2) {System.out.println("返回值的泛值類型:"+type);}}System.out.println("----------------------------");Method test03=c.getMethod("test03", null);Type returnType3=test03.getGenericReturnType();System.out.println(returnType3 instanceof ParameterizedType);} }

    運行結果

    5 注解

    注解的作用

    不是程序本身,可以對程序作出解釋。(這一點跟注釋沒 什么區別)

    可以被其他程序(比如:編譯器等)讀取。(注解信息處理流程,是注解和注釋的重大區別,如果沒有注解信息處理流 程,則注解毫無意義)

    注解的格式:注解是以”@注釋名”在代碼中存在,還可以添加一些參數 值,例如@SuppressWarnings(value=”unchecked”)。

    注解可以附加在 package,class,method,field 等上面,相當于給它們添加了額外的輔助信息,我們可以通過反射機制編程 實現對這些元素的訪問。

    內置的注解

  • @Override :標識方法是重寫的方法
  • @Deprecated :標識的方法不建議使用
  • @SuppressWarnings:用來抑制編譯時的警告信息
    • @SuppressWarinings 需要提供參數才能正常使用,這些參數 都是已經定義好的,我們只需要選擇就可以了。
    • @SuppressWarnings("unchecked") @SuppressWarnings(value={"unchecked","deprecation"})

    總結

    以上是生活随笔為你收集整理的java 获取所有带指定注解的类名_SXT DAY023 反射和注解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。