反射复习
框架设计的灵魂
获取Class对象的方式
Class.forName("全类名")
多用于配置文件,将类名定义在配置文件 中,读取文件,加载类
类名.class
多用于参数的传递
对象.getClass()
多用于对象的获取字节码的方式
同一字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的Class对象都是同一个
Class对象功能
- 获取成员变量们(Fields)
- 获取构造方法们(Constructors)
- 获取成员方法们(Methods)
- 获取类名
一个案例
需求:写一个“框架”,不能改变该类的任何代码的前提下,可以创建任意类的对象并执行其中的任意方法
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;
public class ReflectDemo2 {
public static void main(String[] args) throws IOException, IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException { Properties properties = new Properties(); 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);
} }
|