一.什么是反射
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