概述
Java的反射(reflection)機(jī)制是指在程序的運(yùn)行狀態(tài)中每界,可以構(gòu)造任意一個(gè)類(lèi)的對(duì)象,可以了解任意一個(gè)對(duì)象所屬的類(lèi)家卖,可以了解任意一個(gè)類(lèi)的成員變量和方法眨层,可以調(diào)用任意一個(gè)對(duì)象的屬性和方法。這種動(dòng)態(tài)獲取程序信息以及動(dòng)態(tài)調(diào)用對(duì)象的功能稱為Java語(yǔ)言的反射機(jī)制上荡。
1.反射的作用趴樱?
2.三種獲取Class對(duì)象的方法
3.獲取構(gòu)造器實(shí)例化對(duì)象和屬性信息
4.獲取包信息
5.獲取方法
6.小結(jié)
1-反射的作用
在運(yùn)行時(shí)判定任意一個(gè)對(duì)象所屬的類(lèi)
在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象
在運(yùn)行時(shí)判定任意一個(gè)類(lèi)所具有的成員變量和方法
在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法
2-三種獲取Class對(duì)象的方式
//第一種
Class<?> class1 = new Dog().getClass();
//第二種
Class<?> class2 = Dog.class;
//第三種
Class<?> class3 = Class.forName("com.zlqf.myview.Dog");
打印三種方式獲取的Class,運(yùn)行結(jié)果如下:
class1--》class com.zlqf.myview.Dog
class2--》class com.zlqf.myview.Dog
class3--》class com.zlqf.myview.Dog
從打印結(jié)果可以看出榛臼,三種不同的方式都拿到了同一個(gè)結(jié)果伊佃。
3-獲取構(gòu)造器實(shí)例化對(duì)象和屬性信息
//Dog類(lèi)
public class Dog {
private String name = "大黃";
private String color = "黃色";
public Dog(){}
public Dog(String name,String color){
this.name = name;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void printInfo(){
Log.e("pp","我的信息:名字:"+name+" 毛色:"+color);
}
}
//獲取所有的構(gòu)造器
Constructor<?>[] constructors = class1.getConstructors();
//獲取某個(gè)構(gòu)造器
Constructor<?> constructor = class1.getConstructor(String.class,String.class);
//得到實(shí)例化對(duì)象
Dog dog = (Dog) constructor.newInstance("大黑","黑色");
dog.printInfo();
//獲取color屬性
Field color = class1.getDeclaredField("color");
//跳過(guò)安全檢測(cè)
color.setAccessible(true);
//將dog對(duì)象中的color屬性值改為【白色】
color.set(dog,"白色");
dog.printInfo();
代碼簡(jiǎn)單易懂,通過(guò)反射得到構(gòu)造器沛善,然后實(shí)例化出Dog類(lèi)對(duì)象dog航揉。通過(guò)Class得到color屬性,由于該屬性是private(私有的)金刁,所以需要setAccessible(true)跳過(guò)安全檢查帅涂,然后就可以拿到屬性信息,并進(jìn)行更改操作尤蛮。
打印結(jié)果如下:
我的信息:名字:大黑 毛色:黑色
我的信息:名字:大黑 毛色:白色
4-獲取包信息
//獲取包信息
Class<?> class2 = Dog.class;
Package mPackage = class2.getPackage();
//包名
mPackage.getName();
5-獲取方法
Class<?> class4 = Dog.class;
//獲取構(gòu)造器
Constructor<?> constructor4 = class1.getConstructor(String.class,String.class);
//得到實(shí)例化對(duì)象
Dog dog4 = (Dog) constructor.newInstance("大黑","黑色");
//獲取printInfo方法
Method method = class1.getMethod("printInfo");
//調(diào)用獲取printInfo方法
method.invoke(dog4);
//加上String.class
Method method1 = class1.getMethod("printInfo",String.class);
method1.invoke(dog4,"帶參數(shù)");
如果printInfo方法需要傳入?yún)?shù)媳友,則需要getMethod中聲明,比如
兩次結(jié)果輸入如下
我的信息:名字:大黑 毛色:黑色
我的信息:名字:大黑 毛色:黑色帶參數(shù)
6-小結(jié)
反射可以賦予JVM動(dòng)態(tài)編譯的能力产捞,提升服務(wù)器性能鹃觉,可以使得我們的程序更靈活挪蹭,非常有用。