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