1.反射机制获取类的三种方法
//第一种方式:
Classc1 = Class.forName("Employee");
//第二种方式:
//java中每个类型都有class 属性.
Classc2 = Employee.class;
//第三种方式:
//java语言中任何一个java对象都有getClass 方法
Employee e = new Employee();
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
2.利用反射机制创建对象
Class<?> forName = Class.forName("com.jarye.entity.User");
// 实例化无参构造函数
Object newInstance = forName.newInstance();
// 实例化有参构造函数
Class<?> forName = Class.forName("com.jarye.entity.User");
Constructor<?> constructor = forName.getConstructor(String.class, String.class);
User newInstance = (User) constructor.newInstance("123", "123");
3.反射常用方法
方法名称 |
作用 |
getDeclaredMethods[] |
获取该类的所有方法 |
getReturnType() |
获取该类的返回值 |
getParameterTypes() |
获取传入参数 |
getDeclaredFields() |
获取该类的所有字段 |
setAccessible |
允许访问私有成员 |
4.反射底层原理
反射机制底层其实走的是MethodAccessor,分为2步:
a、访问控制检查(判断该方法的修饰符modifiers是否为public)
b、调用MethodAccessor.invoke()实现方法执行,创建MethodAccessor有两种选择
- sun.reflect.noInflation的设置为true,则ReflectionFactory利用MethodAccessor的字节码生成类MethodAccessorGenerator直接创建一个代理类,通过间接调用原方法完成invoke()任务【使用Java代码生成】
- sun.reflect.noInflation的设置为false或未达到设置值(默认15次)时,创建DelegatingMethodAccessorImpl委托类,并将执行invoke()方法的具体内容交由NativeMethodAccessorImpl实现【使用Native代码生成】
参数 |
说明 |
sun.reflect.noInflation |
是控制是否立即进行类膨胀 |
sun.reflect.inflationThreshol |
类膨胀阈值 |
可以通过启动参数-Dsun.reflect.noInflation=false -Dsun.reflect.inflationThreshold=15