Java反射机制是在运行状态中,对任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法。这种动态获取信息和动态调用对象方法的功能称为Java语言的反射机制。
类的反射机制中类有Class对应,方法有Method对应,属性由Field对应。
反射机制的功能
在运行中分析类的功能。
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法,利用Method对象;
- 生成动态代理。
- 实现通用的数组操作代码。
反射机制的优点
- 可以实现动态创建对象和编译,体现出很大的灵活性(特别是在J2EE的开发中它的灵活性就表现的十分明显)。通过反射机制我们可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。
- Reflection机制允许程序在正在执行的过程中,利用Reflection APIs取得任何已知名称的类的内部信息,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,并可以在执行的过程中,动态生成instances、变更fields内容或唤起methods。
Class类
使用反射动态创建对象实例的两种方式
通过Class的newInstance()方法
该方法要求该Class对象的对应类有无参构造函数
例:Class clazz = Class.forName("entity.User"); //通过Class.forName的方式来得到一个Class类型的实例 Object obj = clazz.newInstance(); //通过这个Class类型的实例的newInstance来初始化
通过Constructor的newInstance()方法
先使用Class对象获得指定的Constructor对象
再调用Constructor对象的newInstance()方法来创建该Class对象对应类的对象
通过该方法可以选择使用指定的构造方法来创建对象
例:
Class clazz = Class.forName("entity.User"); //指定有参的构造方法 Constructor cons = clazz.getConstructor(new Class[] {int.class,String.class,String.class}); //使用有参数的构造方法实例对象 Object obj = cons.newInstance(new Object[]{1,"scott","1234"}); //转换为实际操作类 User user = (User)obj;
java反射这Spring IOC中的应用
在spring配置文件中有
<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>
spring通过配置进行实例化对象并放到容器中的伪代码:
//解析<bean .../>元素的id属性得到该字符串值为“courseDao”
String idStr = "courseDao";
//解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl”
String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";
//利用反射知识,通过classStr获取Class类对象
Class<?> cls = Class.forName(classStr);
//实例化对象
Object obj = cls.newInstance();
//container表示Spring容器
container.put(idStr, obj);
通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理获取到配置里面类的实例对象,存入到Spring的bean容器中。
- 总结:
只要在代码或配置文件中看到类的完整路径(包.类),其底层原理基本上使用的就是Java的反射机制。
推荐一个讲的很好的博客:https://blog.youkuaiyun.com/u012585964/article/details/52011138