CodeEggDailyInterview icon indicating copy to clipboard operation
CodeEggDailyInterview copied to clipboard

简述内省与暴力反射

Open kukyxs opened this issue 5 years ago • 1 comments

kukyxs avatar Oct 24 '19 23:10 kukyxs

1、什么是JavaBean? JavaBean是一个特殊的 Java类,这个类中的方法的名称符合某种特定的规则 2、什么是内省? JDK中提供了对 JavaBean进行操作的一些 API,这套API就成为内省。 3、反射与内省的区别? 反射可以操作各种不同的 java类,内省只是通过反射来操作 JavaBean类。 JavaBean类里面操作的都是成员变量,都是通过 setXXX和getXXX方法来获取成员变量,这样的类用内省来操作会更简单。

内省在wiki上的解释:

在计算机科学中,内省是指计算机程序在运行时(Run time)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查。 不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。

内省和反射有什么区别: 反射是在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。 内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性。 image 在Java内省中,用到的基本上就是上述几个类。 通过BeanInfo这个类就可以获取到类中的方法和属性,具体的可以参考JDK文档 博客链接

4、什么是暴力反射 类里面的私有变量,通过普通的 getField反射无法获得,只有通过 getDeclaredField()获得,然后利用setAccessible方法访问。 这个获取和访问的过程就是暴利访问。

 Field fieldX = ReflectPoint.class.getDeclaredField("x"); 
 fieldX.setAccessible(true);

kami-zeros avatar Oct 25 '19 14:10 kami-zeros