反射:用来调用hide之类的方法
代码演示:
/**
* 反射步骤:
* 1、获取Class对象,可以有forName、xxx.class、对象.getClass()
* 2、获取getConstructor()对象,有参数需要传入参数类型
* 3、获取对象实例,constructor.newInstance(),也可以直接使用class.newInstance(),区别是class只能使用无参数的构造方法
* 4、获取方法对象,有参数需要传入方法类型
* 5、调用invoke方法,传入instance实例对象,并传入参数
*/
try {
Class clz=Class.forName("com.chenyan.iamgepicker.imagepicker.data.Apple");
Constructor constructor = clz.getConstructor(int.class);
Apple instance = (Apple) constructor.newInstance(45);
// Method clzMethod = clz.getMethod("setPrice", int.class);
// clzMethod.invoke(instance,50);
Method getPrice = clz.getMethod("getPrice");
System.out.println("apple的price:"+getPrice.invoke(instance));
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
暴力反射:
跟普通反射区别的是获取方法对象后需要开启暴力反射权限,如:方法对象.setAccessible(true);
为什么使用暴力反射:
调用类中私有的成员变量或者方法
反射机制的应用场景:
逆向代码 ,例如反编译
与注解相结合的框架 例如Retrofit
单纯的反射机制应用框架 例如EventBus 2.x
动态生成类框架 例如Gson
反射机制的优缺点:
优点:
运行期类型的判断,动态类加载,动态代理使用反射。
缺点:
性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。
总结:
Java的反射机制在平时的业务开发过程中很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习了一下,还有很多未知的知识等以后用到再做补充。