1. 程式人生 > >JAVA的反射機制

JAVA的反射機制

fields lds 類定義 strong odi ava nbsp win 屬性

反射

獲取類的三種方法(以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                

getDeclaredFields

返回的是申明為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的反射機制