java反射的底层原理,机制,优点和缺点
(1).什么是反射
java反射机制核心是在程序运行时动态加载类对象并获取类的信息,本质是jvm获得class对象后,再通过对象反编译,获取对象各种信息,普通获取对象的方式是通过编译生成.class文件,jvm再加载.class文件获取类的信息,在jvm中生成一个对象
(2)反射优点
<1>可通过配置文件动态加载所需要的的类,而不需要在编译前去new一个对象,对项目进行了解耦
<2>可以通过反射访问java的方法,属性,包括私有的(需要setAccessible(true)跳过权限检查)
(3)反射效率低的原因
<1>Method的invoke方法要对参数进行装箱和拆箱
invoke方法传参是Object[]类型,如果方法参数是简单类型,需要装箱为Object类型,
比如Long在java编译的时候,用了Long.valueOf()转型,并且封装为Objcet数组,
然后生成对象字节码时,因为需将参数传入方法,需要将参数数组拆箱,
恢复到没有被Objcet[]包装前的样子,装箱和拆箱造成额外的内存浪费
<2>需要检查方法的可见性
每次调用invoke都需要检查方法的可见性
<3>反射时需要校验参数
invoke时需要检查每个实际参数和形参的类型是否匹配
<4>反射方法难以内联
因为是动态去执行方法,通过java的对象反编译去获取类的信息去执行,Jit优化较难识别
<4>每次调用getMethod方法会对method对象做一次拷贝
@CallerSensitive
public Method getMethod(String name, Class<?>... parameterTypes)
throws NoSuchMethodException, SecurityException {
Objects.requireNonNull(name);
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
checkMemberAccess(sm, Member.PUBLIC, Reflection.getCallerClass(), true);
}
Method method = getMethod0(name, parameterTypes);
if (method == null) {
throw new NoSuchMethodException(methodToString(name, parameterTypes));
}
return getReflectionFactory().copyMethod(method);
}