前言:JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射機(jī)制。 Java反射的使用:有如下student類: public class Student {
private int age;
private String name;
public Student() {
super();
}
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
public void study() {
System.out.println("測(cè)試反射!");
}
}
現(xiàn)在通過反射來(lái)獲取student類的信息: 一、獲取class對(duì)象 獲取class對(duì)象有三種方式,如下: 1、方式一: Class clazz =Class.forName("com.demos.reflect.Student");
注意:forName里面的參數(shù)是Student的全類名。 2、方式二: Class clazz = Student.class;
3、方式三: Class clazz = stu.getClass();
注:這種方法是已有該類的對(duì)象時(shí)使用,即已有stu對(duì)象。 二、獲取類的信息 得到了Class對(duì)象后,就可以通過Class對(duì)象獲取類的信息,部分方法如下: 1、獲取屬性: Field[] fs = clazz.getDeclaredFields();//獲取所有屬性
for(Field f : fs) {
//獲取屬性名
System.out.println(f.getName());
//獲取屬性的數(shù)據(jù)類型
Class pp = f.getType();
System.out.println(pp.getName());//類型帶包名
//System.out.println(pp.getSimpleName());//不帶包名
}
2、獲取類的方法: //拿單個(gè)方法(study方法有參數(shù)的話還得寫上參數(shù)類型,
//例如:clazz.getMethod("study",String.Class))
//Method m = clazz.getMethod("study");//獲取單個(gè)方法
//Method[] ms = clazz.getMethods();//包括父類方法
Method[] ms = clazz.getDeclaredMethods();//不包括父類方法
for(Method m : ms) {
//獲取類的方法名
System.out.println(m.getName());
}
三、動(dòng)態(tài)創(chuàng)建對(duì)象,調(diào)用方法 1.1、創(chuàng)建對(duì)象方式一: Object obj = clazz.newInstance();
System.out.println(obj);
注意:這種方式創(chuàng)建對(duì)象因?yàn)闆]傳參數(shù),所以Student類必須要有一個(gè)無(wú)參構(gòu)造。 1.2、創(chuàng)建對(duì)象方式二: Constructor cos = clazz.getConstructor(int.class,String.class);
Object obj2 = (Student)cos.newInstance(20,"張三");
System.out.println(obj2);
注意:這種方式帶參創(chuàng)建對(duì)象,需要有帶參構(gòu)造。 2、調(diào)用方法: 有了對(duì)象就可以調(diào)該類的方法,如下: Method m = clazz.getMethod("study");
m.invoke(obj);
控制臺(tái)輸出輸出"測(cè)試反射",正是study方法里打印的那句話。
總結(jié): Java的反射機(jī)制應(yīng)用非常廣泛,像spring、hibernate等框架底層都用到了反射,理解反射機(jī)制,可以幫助我們更好的理解這些框架的原理。
|