反射

78 阅读3分钟

一.什么是反射

API文档的官方解释:反射运行对成员变量,成员方法和构造方法的信息进行编程访问

简单来说,反射就是从类里把成员变量,构造方法,成员方法挨个拿出来

复杂来说,Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

二.反射的功能作用

功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式和单例模式。

  • 单例模式(Singleton):这个模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。这样做就是为了节省内存空间,保证我们所访问到的都是同一个对象。

  • 工厂模式(Factory):工厂模式利用Java反射机制和Java多态的特性可以让我们的程序更加具有灵活性。用工厂模式进行大型项目的开发,可以很好的进行项目并行开发。

用人话来说,举个栗子:我们知道一个类有成员变量,构造方法,成员返回,当我们创建了一个类的对象,想知道对象的某一个方法的修饰符是public还是private的怎么办?凡是类里面的所有内容,都可以通过反射获取:

  • 获取class对象:Class
  • 字段(成员变量)Field
  • 构造方法Constructor
  • 成员方法Method

eg.获取class对象

(1)使用类的.class属性:通过类名后加上.class即可获取Class对象,//更多的当作参数传递
例如:Class clazz = MyClass.class; 

(2)使用对象的getClass()方法:通过对象的getClass()方法可以获取Class对象,//当有了这个类的对象的时候
例如:Class clazz = myObject.getClass(); 

(3)使用Class类的forName()方法:通过Class类的forName()方法可以根据类的全限定名获取Class对象,//最常用
例如:Class clazz = Class.forName("com.example.MyClass");

三.跟配置文件结合动态创建

配置文件信息

classname=com.example.myreflect6.Student
method=study

核心代码

//1.读取配置文件中的信息
        Properties prop = new Properties();
        FileInputStream fis = new FileInputStream("myreflect\\prop.properties");
        prop.load(fis);
        fis.close();
 
        //2.获取全类名和方法名(获取配置文件的信息)
        String className = (String) prop.get("classname");
        String methodName = (String) prop.get("method");
 
        //3.利用反射创建对象并运行方法
        Class clazz = Class.forName(className);
 
        //4.获取构造方法
        Constructor con = clazz.getDeclaredConstructor();
        Object o = con.newInstance();
 
        //5.获取成员成功并运行
        Method method = clazz.getDeclaredMethod(methodName);
        method.setAccessible(true);
        method.invoke(o);

扩展:当不像运行Student的study方法时,可以通过修改配置文件信息,实现动态反射

classname=com.example.myreflect6.Teacher
        method=teach

该部分引用自 WoVoM

四.小结

反射小结CD152A7A2F0F297589B5C1ACF22F5246.jpg