CodeEggDailyInterview
CodeEggDailyInterview copied to clipboard
简述内省与暴力反射
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的属性。
在Java内省中,用到的基本上就是上述几个类。
通过BeanInfo这个类就可以获取到类中的方法和属性,具体的可以参考JDK文档
博客链接
4、什么是暴力反射 类里面的私有变量,通过普通的 getField反射无法获得,只有通过 getDeclaredField()获得,然后利用setAccessible方法访问。 这个获取和访问的过程就是暴利访问。
Field fieldX = ReflectPoint.class.getDeclaredField("x");
fieldX.setAccessible(true);