JAVA反射_筆記

在JAVA中,一切都是對象,那么你新建的一個(gè)class也是對象嗎?

是的,新建的class也是對象,它是java.lang.Class的實(shí)例對象。
      class A{}
      A a = new A();
1,Class c1 = a.class; // c1表示A這個(gè)類的類類型(小a是A的實(shí)例對象) ,這也說明了每一個(gè)類都有一個(gè)靜態(tài)成員class;
2,Class c2 = a.getClass(); // c2表示A這個(gè)類的類類型 ,通過該A類的對象a的getClass()方法獲取。
c1 == c2 //它們都是A類的類類型,一個(gè)類只可能是Class類的一個(gè)實(shí)例對象。 
3, Class c3 = null;
        c3 = Class.forName("com.wjb.A"); //括號里寫的是全類名
              c2 == c3
 所以,完全可以通過類類型(c1 , c2 , c3)創(chuàng)建A的實(shí)例對象;
 A a = (A)c1.newInstance(); // 注意A類一定要有無參的構(gòu)造方法

編譯時(shí)加載的類是:靜態(tài)加載類

運(yùn)行時(shí)加載的類是:動態(tài)加載類

知道了類類型后,可以通過c1.獲取類的一些信息,方法的一些信息,成員變量的一些信息。

集合的泛型也是一種反射,但是只在編譯時(shí)有效,運(yùn)行時(shí)就沒有泛型了。

Class,method,field(類,方法,成員變量)的操作都是繞過編譯的一些操作。

package javaReflect;
import java.lang.reflect.Method;
import java.util.ArrayList;
/**
 * Created by wjb on 2017/3/6.
 */
public class Demo {
    public static void main(String[] args) {
        String s = "Hello";
        ClassUtis.printMessage(s);

        ArrayList list1 = new ArrayList();

        ArrayList<String> list2 = new ArrayList<String>();
        list2.add("hello");
        Class c = list2.getClass();
        try {
            Method method = c.getMethod("add", Object.class);
            method.invoke(list2,20);  // 調(diào)用方法,繞過編譯就繞過泛型了。
            System.out.println(list2.size());
            System.out.println(list2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
list2的泛型是String類型,按道理是不能加入20的,但是繞過了編譯,可以加進(jìn)去。說明泛型只在編譯時(shí)有效。

對于內(nèi)部類的反射使用:
      Office office = new Office();
      //獲取所有的內(nèi)部類
      Field[] fields = office.getClass().getDeclaredFields();
          for (Field f : fields) {
              //設(shè)置屬性可以訪問
              f.setAccessible(true);
              //獲取每一個(gè)內(nèi)部類屬性的全路徑名
              String name = f.getType().getName();
              //所有內(nèi)部類里面的屬性名
              Field[] fields2 = Class.forName(name).getDeclaredFields();
              for (Field fid : fields2) {
                      //設(shè)置屬性可以訪問
                      fid.setAccessible(true);
                      //獲取內(nèi)部類屬性上的注解,這里的注解是自定義的
                      XlsMeta xlsMeta = fid.getAnnotation(XlsMeta.class);
                      //獲取注解里面定義的required
                      String required = xlsMeta.required();
                      //首選屬性檢查
                     // if (required.equals("Preferred")) {
                      //    list1.add("屬性:" + fid.getName() + "\t建議不要為空\n");
                     // }
                      //必填屬性檢查
                     // if (required.equals("Required")) {
                       //   list2.add("屬性:" + fid.getName() + "\t不能為空\n");
                     // }
              }
          }
Office類:
自定義注解:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容