一、 什么是反射
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。
二、反射与工厂模式
工厂模式一般有两类,一类是工厂方法模式,另一类是抽象工厂模式。但是《head first 设计模式》中,通过某些例子,实际上把工厂模式分为三种:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
可以通过反射,在工厂类里根据配置文件获得要创建的对象
public static INormalMessageHandler getNormalMessageHandler() {
if (normalMessageHandler == null) {
try {
//获取
defaultNormalHandler = Configuration.getProperty("weixin4j.message.handler.normal", defaultNormalHandler);
if (Configuration.isDebug()) {
System.out.println("微信接受消息处理Hanler:" + defaultNormalHandler);
}
// 加载处理器
Class<?> clazz = Class.forName(defaultNormalHandler);
try {
normalMessageHandler = (INormalMessageHandler) clazz.newInstance();
} catch (Exception ex) {
System.out.println("初始化 INormalMessageHandler 异常:");
ex.printStackTrace();
}
} catch (ClassNotFoundException ex) {
System.out.println("找不到: " + defaultNormalHandler + " 类!");
ex.printStackTrace();
}
}
return normalMessageHandler;
}
三、反射有什么作用
1、获得Class对象
使用Class类的forName静态方法
直接获取某一个对象的class
调用某个对象的getClass()方法
2、判断是否为某个类的实例
用instanceof关键字来判断是否为某个类的实例
3、创建实例
使用Class对象的newInstance()方法来创建Class对象对应类的实例。
先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。
4、获取方法
getDeclaredMethods()
5、获取构造器信息
getDeclaredMethods()
getMethods()
getMethod()
6、获取类的成员变量(字段)信息
getFiled: 访问公有的成员变量
getDeclaredField:所有已声明的成员变量。但不能得到其父类的成员变量
getFileds和getDeclaredFields用法
7、调用方法
invoke()
8、利用反射创建数组
Array.newInstance()
四、通过反射获取Class类
1.调用运行时类本身的.class属性
Class clazz = String.class;
2,通过运行时类的对象获取
Person p = new Person();
Class clazz = p.getClass();
3.通过Class的静态方法获取:体现反射的动态性
String className = “java.util.commons”;
Class clazz = Class.forName(className);
4.通过类的加载器
String className = “java.util.commons”;
ClassLoader classLoader = this.getClass().getClassLoader();
Class claz = classLoader.loadClass(className);
五、阅读源码
java.long.reflect.*