在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類:

自定義注解:

