0%

反射复习

反射复习

框架设计的灵魂

获取Class对象的方式

  1. Class.forName("全类名")

    多用于配置文件,将类名定义在配置文件 中,读取文件,加载类

  2. 类名.class

    多用于参数的传递

  3. 对象.getClass()

    多用于对象的获取字节码的方式

同一字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的Class对象都是同一个

Class对象功能

  1. 获取成员变量们(Fields)
  2. 获取构造方法们(Constructors)
  3. 获取成员方法们(Methods)
  4. 获取类名

一个案例

需求:写一个“框架”,不能改变该类的任何代码的前提下,可以创建任意类的对象并执行其中的任意方法

1
2
className=com.zephon.domain.Person
method=eat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.zephon.reflect;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
* @author Zephon
* @version V1.0
* @Package com.zephon.reflect
* @date 2020/2/1 下午6:49
* @Copyright ©
*/
public class ReflectDemo2 {
/**
* 实现:
* 1. 配置文件
* 2. 反射
* @param args
*/
public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
// 加载配置文件
// 创建Properties对象
Properties properties = new Properties();
// 加载配置文件
// 获取class目录下的配置文件
ClassLoader classLoader = ReflectDemo2.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
properties.load(is);
// 获取配置文件中定义的数据
String className = properties.getProperty("className");
String method = properties.getProperty("method");
// 加载该类进内存
Class<?> cls = Class.forName(className);
Object obj = cls.newInstance();
Method method1 = cls.getMethod(method);
method1.invoke(obj);

}
}