java反射

目前是jdk1.8,主要結合此進行;java

更新於2019-05-06數據庫

反射

java提供的自省能力,能夠獲取類定義,方法,字段,構造器;能夠調用方法,構造實例,還能夠修改類定義this

反射與jigsaw

--illegal-access={ permit | warn | deny } jdk9中設置改參數,能夠控制反射訪問對應目標包的權限code

1. 獲取字段

MonthTask monthTask = monthTaskrep.getOne(mainTaskId + 0L);
Class<? extends MonthTask> mclass = monthTask.getClass();
Field field= mclass.getDeclaredField(name);
Object val=field.get(monthTask);

根據實例獲取class,而後用class的到field,而後經過field來獲取結果,經常使用Field.get(Class的instance),固然還有其餘獲取值得方法,如Field.getString(instance),Field.getInteger(instance);對象

2. 調用方法

Method method =mclass.getDeclaredMethod("getTal" + i + "goal") ;//1
Object o= method.invoke(monthTask);//2
  • 1.從class中獲取方法對象,mclass.getDeclaredMethod(String methodName,Class<?>... parameterTypes),第二個位置爲參數列表; 貌似jdk1.8不支持直接獲取private類型的field,而後只能用method去取了;在獲取set方法時,結果沒寫參數列表,因此的到的方法時null;:joy:
  • 2.method.invoke(instance,Object... args);第二位置爲該方法參數實例,如 method.invoke(instance,1,"聖鬥士",5L);

3. 構造實例

Class<? extends MonthTask> mclass = monthTask.getClass();
  MonthTask monthTask=  mclass.newInstance();

這個monthTask須要你去賦值;即經過獲取各類set方法去賦值;各類javaBean都是經過這種方式構造的; 固然MonthTask類必須符合javaBean的標準; ORM的映射也是經過反射實現的,繼承

4. 獲取元數據(註解)

<A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass){

}
Entity entity= mclass.getDeclaredAnnotation(Entity.class);
  • 獲取了一個在mclass類上的Entity註解entity的實例,而後經過該entity和mclass在一塊兒將其轉化成具體的數據庫的table;具體代碼缺;

5. 獲取實現的接口

Class<?> classz=new ArrayList<String>().getClass();
 classz=ArrayList.class;
 Class<?> [] interfaces= classz.getInterfaces()();
for(Class<?>  interface:interfaces){
    System.out.println(interface.getName());
}
  • 輸出會包含 java.lang.List; 由於ArrayList實現了List接口; 能夠經過繼承的接口來判斷該類有什麼方法;或者對其進行鍼對性的操做;

6.修改訪問權限

Field world = aClass.getDeclaredField("world");
            if(!world.isAccessible()){
                world.setAccessible(true);
                System.out.println(world.get(this));
            }
  • Field,Constructor,Method繼承了AccessibleObject類
  • AccessibleObject類定義了訪問限權相關的數據和動做;若是沒有訪問權限,就強制改變訪問權限;

在實際操做中,很是方便,但須要慎用接口

相關文章
相關標籤/搜索