小天带你了解java反射
在学习框架的时候,总是对各种注解感到非常的费解。为什么可以这样写,为什么能实现这种功能,很迷茫。java反射和注解开发相当于框架的一个基础。
反射
什么是反射?
java反射机制是在运行状中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射。
黑人问号???
这他妈是啥?我也不知道。
说人话就是
反射是java api,是java提供的现成的类。接受api提供的功能
是java提供的动态执行机制,动态加载类,动态创建对象,动态访问属性,动态调用方法。
静态与动态
静态:实现约定的规则,执行期间按照固定规则执行。
动态:实现没有约定,在执行期间动态确定执行规则。
java中的静态执行,编译已经就确定执行规则(执行次序),在运行期间按照编译结果顺序执行。
Foo foo = new Foo(); foo.hello();
java中的动态执行:运行期间才能确定加载哪些类,创建哪些对象,执行哪些方法。
Class类
Object中有一个方法 getClass()可以返回一个Class对象。
Class这个类用于模拟一个类的属性、方法、构造器。
获取class对象的三种方式
1、Class.forName("")
只需要知道名称
2、obj.getClass();
只需要这个对象
3、obj.class
需要对象
获取Class对象的属性
Field field = cls.getDeclaredField("属性名")
获取的属性会以field对象来表示。
获得构造器
cls.getDeclaredConstructor("class数组 内含构造器参数的class对象")
cls.getDeclaredConstructor(new Class[]{Integer.class});
获得所有的构造器
cls.getDeclaredConstructors();
动态创建对象
Object obj = cls.newInstance();
只能调用无参的构造函数,即默认的构造函数
抛出所有由别调用构造函数抛出的异常。
要求被调用的构造函数是可见的,也即必须是public类型的
Object obj = constructor.newInstance(new Object[]{});
可以根据传入的参数,调用任意构造函数
在特定的情况下,可以调用私有的构造函数。
执行cls引用的类信息中的无参数构造器,动态创建实例。如果类没有无参数构造器,则抛出异常!
反射可以调用有参数构造器。
动态获取类的方法信息
反射api提供了动态获取类中方法信息的api:
Method[] ary = cls.getDeclaredMethods();
获得一个具体的方法
cls.getDeclaredMethod("方法名称","Class<?> ...parameterTypes(三个点代表java的可变参数,也就是数组");
第二个参数就是形参的class对象
Method提供了获取方法详细信息的方法:
//获取方法名
String name = method.getName();
用法:还记得Spring在写DAO的时候必须要添加get、set方法吗?为什么必须这么做呢?因为只有这样,Spring才能找到这种方法
//遍历的时候加入一个这样的判断,就可以判断get方法
boolean isget = name.startWith("get")
//同上可以判断set方法
boolean isset = name.startWith("set")
再强调一下规范的重要性,如果不遵守程序员之间的规范,很多东西会非常非常的不方便,甚至无法使用高级的框架。
//获取返回值类型
Class type = method.getReturnType();
动态执行方法
invoke:调用method方法
语法:
method.invoke(执行方法的对象,传递的参数)
必须在对象上执行一个非静态方法,调用方法时候必须有对象。
在invoke方法执行时候,必须传递包含当前方法的对象。
反射用途
1、eclipse中解析类的结构使用了反射
2、JUnit识别被测试方法使用了反射
3、Spring管理Bean对象,注入Bean属性使用了反射
利用反射创建Bean对象实例
利用反射注入Bean的属性
4、注解的解析使用了反射
利用反射api支持注解
5、强行执行私有方法
浙公网安备 33010602011771号