Java反射技术
通过反射创建类对象和调用方法小案例解析
**PS:**记录这个是为了学习动态代理而作的前期准备工作,Java反射技术可以反射很多内容,但是笔者只是对于创建类对象和方法进行反射,并通过一个小案例表示^ _ ^!
首先我们准备一个类 对这个类的构造方法和函数进行反射
public class ReflectDemo {
//字段
private String name;
//getter setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造方法 构造方法提供一个无参构造器 和一个带String形参的有参构造器
public ReflectDemo() {
}
public ReflectDemo(String name) {
this.name = name;
}
//成员函数
public void methodName(String name) {
System.err.println("This is a test for Reflect!" + name);
}
}
对这个类的构造函数进行反射
笔者将这些代码重构为了两个函数
//反射生成对象 此处使用的无参构造函数生成的类对象
public ReflectDemo getInstance() {
ReflectDemo object = null;
try {
//给类加载器注册了一个类ReflectDemo的全限定名,
//然后通过newInstance方法初始化一个类对象
object = (ReflectDemo)
Class.forName("com.ww.pojo.ReflectDemo")
.newInstance();
} catch (ClassNotFoundException | InstantiationException |
IllegalAccessException e) {
e.printStackTrace();
}
return object;
}
//反射生成对象 此处使用有参构造函数生成类对象
public ReflectDemo newInstanceByParam() {
ReflectDemo object = null;
try {
//先通过forName加载到类的加载器,让后通过getConstructor方法定义对应字段
//的构造方法 进行对象的创建
object = (ReflectDemo)
Class.forName("com.ww.pojo.ReflectDemo")
.getConstructor(String.class)
.newInstance("test name");
} catch (ClassNotFoundException | InstantiationException |
IllegalAccessException | NoSuchMethodException |
SecurityException | IllegalArgumentException |
InvocationTargetException e) {
e.printStackTrace();
}
return object;
}
这两个函数的功能就是相当于
ReflectDemo object = new ReflectDemo();
ReflectDemo object = new ReflctDemo("test name");
对这个类的函数进行反射
同样的对于代码 重构为了函数
//反射方法
public Object reflectMethod() {
Object object = null;
ReflectDemo target = new ReflectDemo();
try {
//getMethod方法第一个参数是方法名称,第二个参数是参数类型就是形参,是一个列表
Method method = ReflectDemo.class
.getMethod("methodName", String.class);
//使用invoke方法执行方法 第一个参数是确定哪个对象调用方法,第二个是方法实参
object = method.invoke(target, "test name");
} catch (NoSuchMethodException | SecurityException |
IllegalArgumentException | IllegalAccessException |
InvocationTargetException e) {
e.printStackTrace();
}
return object;
}
这个函数的功能相当于
//target 是创建出来的ReflectDemo对象
target.method("test name");