Java中的反射
2019-08-05 本文已影响83人
iDevOps
什么是反射?
- 反射是框架设计的灵魂
- 正在运行的程序, 通过反射可以动态获取这个类的所有信息, 包括属性、方法、构造方法等
- 可以反编译.class --> .java
常见的应用场景
- Jdbc加载驱动
- Spring Ioc
- 框架的封装
通过反射获取Class对象的三种方式
- 方式1
Class1 = Class.forName("com.test.domain.Person");
1. 将字节码文件加载进内存,返回Class对象
2. 多用于配置文件,将类名定义在配置文件中, 读取文件,加载类
- 方式2
Class2 = Person.class;
1. 通过类名的属性class获取
2. 多用于参数的传递
- 方式3
Person p = new Person();
Class3 = p.getClass();
1. 通过对象方法获取
2. 多用于对象的获取字节码的方式
通过反射创建对象
- 无参构造器
Class<?> aClass = Class.forName("domain.Person");
// 创建Class对象所表示对象的一个新实例,调用了Person的无参构造方法
Object o = aClass.newInstance();
System.out.println(o.toString()); //Person{name='null', age=0}
- 有参构造器
// 实例化有参构造函数
Class<?> aClass = Class.forName("domain.Person");
Constructor<?> constructor = aClass.getConstructor(String.class, Integer.class);
Person p = (Person) constructor.newInstance("sn", 11);
System.out.println(p.toString());//Person{name='sn', age=11}
常见Api
方法名称 | 作用 |
---|---|
getDeclaredMethods | 获取该类的所有方法 |
getReturnType() | 获取该类的返回值 |
getParameterTypes() | 获取传入参数 |
getDeclaredFields() | 获取该类的所有字段 |
setAccessible | 允许访问私有成员 |
小补充: 如何禁止使用反射机机制创建对象
答: 将构造函数私有化