您的位置:首页 > 编程语言 > Java开发

java反射机制及其应用

2018-03-16 17:44 232 查看
Java反射机制是在运行状态中,对任意一个类都能够知道这个类的所以属性和方法;对于任意一个对象都能够调用它的任意一个方法。这种动态获取信息和动态调用对象方法的功能称为Java语言的反射机制。

类的反射机制中类有Class对应,方法有Method对应,属性由Field对应。

反射机制的功能

在运行中分析类的功能。

在运行中查看对象,例如,编写一个toString方法供所有类使用。

实现通用的数组操作代码。

利用Method对象。

反射机制的优点

可以实现动态创建对象和编译,体现出很大的灵活性(特别是在J2EE的开发中它的灵活性就表现的十分明显)。通过反射机制我们可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。

Class类

使用反射动态创建对象实例的两种方式

通过Class的newInstance()方法

该方法要求该Class对象的对应类有无参构造函数

例:

Class  clazz = Class.forName("entity.User");
Object obj =  clazz.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的反射机制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java