JAVA的反射機制
反射
獲取類的三種方法(以Student類為例):
1.Class c1=Class.forName("Student");
2.Class c2=Student.class;
3.Student student=new Student();
Class c3=student.getClass();
創建對象:
//獲取類
Student student=new Stusdent();
Class c1=student.getClass();
//獲取類以後,創建對象
Object obj=c.newInstance();//調用了Student類的無參構造方法
獲取屬性:分為所有屬性和指定屬性。
getFields
返回的是申明為public的屬性,包括父類中定義, 返回的是指定類定義的所有屬性,不包括父類的。
1.獲取所有屬性
//獲取類
Class c2=Student.getClass();
Field [ ] fields=c2.getDeclaredFields();
//創建StringBuffer用來存儲屬性
StringBuffer sb=new StringBuffer();
for(Field field :fields){
sb.append(Modifier.toString(c2.getModifiers())+"class"+c2.getSimpleName());//輸出是修飾符名+class+類名:eg. public class Student
sb.append(Modifier.toString(field.getModifiers()+""));//添加修飾符名
sb.append(field.getType().getSimpleName());//添加屬性類型名
sb.append(field.getSimpleName());//添加屬性名
}
2.獲取指定屬性:
//獲取類
Class c2=Class.forName("Student");
//獲取指定屬性
Field field=c2.getDeclareField("no");
//先實例化對象,然後為屬性賦值
Object obj=c2.newInstance();
//打破封裝
field.setAccessible(true); //使用反射機制可以打破封裝性,導致了java對象的屬性不安全。
field.set(obj,"2015110999");//obj為實例化之後的對象,2015110999為定義的屬性值
//獲取o對象的field屬性的值
field.get(o);
獲取方法:分為普通方法和構造方法。
方法名 含義
getDeclaredMethods() 獲取所有方法
getReturnType() 獲取方法的返回值類型
getParameterTypes() 獲取方法的傳入參數類型
getDeclaredMethod("方法名",參數類型.class) 獲取特定的方法
構造方法
getDeclaredConstructors() 獲取所有的構造方法
getDeclaredConstructor(參數類型.class) 獲取特定的構造方法
父類和父接口
getSuperClass() 獲取某類的父類
getInterfaces() 獲取某類的父接口
JAVA的反射機制