什么是反射
反射机制允许我们在运行程序时发现和使用类的信息,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,可以调用它的任意方法和属性,并且能改变它的属性。
反射的优点
反射使得代码可以在运行时装配,可以降低代码耦合度,实现动态代理等。
反射的具体实例
实现基本类
public class LearnReflect {
private String name = "jxl";
public int age = 24;
public LearnReflect(){
}
private void say(){
System.out.println("private say()...");
}
public void work(){
System.out.println("public work()...");
}
}
获取 Class 对象
有三种方式
1.通过 Object 类中的 getClass() 方法
LearnReflect lr = new LearnReflect();
Class cls = lr.getClass();
2.通过 .class 方式得到
Class cls = LearnReflect.class;
3.通过 forName() 获取(常用)
Class cls = Class.forName("LearnReflect");
通过 Class 类获取成员变量,成员方法等
1.获取类的属性、方法
Class cls = Class.forName("LearnReflect");
String className = cls.getName();
System.out.println("className:" + className);
//获取公有属性
Field[] fields = cls.getFields();
for(Field field:fields){
System.out.println("public field:" + field.getName());
}
//获取所有属性
Field[] allFields = cls.getDeclaredFields();
for(Field field:allFields){
System.out.println("all field:" + field.getName());
}
//获取public方法
Method[] methods = cls.getMethods();
for(Method method:methods){
System.out.println("private method:" + method.getName());
}
//获取所有方法
Method[] allMethods = cls.getDeclaredMethods();
for(Method method:allMethods){
System.out.println("all method:" + method.getName());
}
2.动态改变属性值
//获取属性
Field f = cls.getDeclaredField("name");
//启用和禁用访问安全检查的开关,值为 true,则表示反射的对象在使用时应该取消 java 语言的访问检查;反之不取消
f.setAccessible(true);
System.out.println(f);
Object lr2 = cls.newInstance();
//改变属性值
f.set(lr2, "xlj");
System.out.println("lr2.name:" + f.get(lr2));