java反射机制及其应用

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通过配置进行实例化对象并放到容器中的伪代码:

//解析.../>元素的id属性得到该字符串值为“courseDao”  
String idStr = "courseDao";  
//解析.../>元素的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.csdn.net/u012585964/article/details/52011138

你可能感兴趣的:(java)