概述
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。
1.反射的作用?
2.三种获取Class对象的方法
3.获取构造器实例化对象和属性信息
4.获取包信息
5.获取方法
6.小结
1-反射的作用
在运行时判定任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判定任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
2-三种获取Class对象的方式
//第一种
Class<?> class1 = new Dog().getClass();
//第二种
Class<?> class2 = Dog.class;
//第三种
Class<?> class3 = Class.forName("com.zlqf.myview.Dog");
打印三种方式获取的Class,运行结果如下:
class1--》class com.zlqf.myview.Dog
class2--》class com.zlqf.myview.Dog
class3--》class com.zlqf.myview.Dog
从打印结果可以看出,三种不同的方式都拿到了同一个结果。
3-获取构造器实例化对象和属性信息
//Dog类
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);
}
}
//获取所有的构造器
Constructor<?>[] constructors = class1.getConstructors();
//获取某个构造器
Constructor<?> constructor = class1.getConstructor(String.class,String.class);
//得到实例化对象
Dog dog = (Dog) constructor.newInstance("大黑","黑色");
dog.printInfo();
//获取color属性
Field color = class1.getDeclaredField("color");
//跳过安全检测
color.setAccessible(true);
//将dog对象中的color属性值改为【白色】
color.set(dog,"白色");
dog.printInfo();
代码简单易懂,通过反射得到构造器,然后实例化出Dog类对象dog。通过Class得到color属性,由于该属性是private(私有的),所以需要setAccessible(true)跳过安全检查,然后就可以拿到属性信息,并进行更改操作。
打印结果如下:
我的信息:名字:大黑 毛色:黑色
我的信息:名字:大黑 毛色:白色
4-获取包信息
//获取包信息
Class<?> class2 = Dog.class;
Package mPackage = class2.getPackage();
//包名
mPackage.getName();
5-获取方法
Class<?> class4 = Dog.class;
//获取构造器
Constructor<?> constructor4 = class1.getConstructor(String.class,String.class);
//得到实例化对象
Dog dog4 = (Dog) constructor.newInstance("大黑","黑色");
//获取printInfo方法
Method method = class1.getMethod("printInfo");
//调用获取printInfo方法
method.invoke(dog4);
//加上String.class
Method method1 = class1.getMethod("printInfo",String.class);
method1.invoke(dog4,"带参数");
如果printInfo方法需要传入参数,则需要getMethod中声明,比如
两次结果输入如下
我的信息:名字:大黑 毛色:黑色
我的信息:名字:大黑 毛色:黑色带参数
6-小结
反射可以赋予JVM动态编译的能力,提升服务器性能,可以使得我们的程序更灵活,非常有用。