反射进阶
目录
一、Proxy 动态代理机制
Java 的反射机制提供了动态代理的实现。 代理模式的作用是为其他对象提供一种代理以控制这个对象的访问,而动态代理可以让我们不用去多实现一个接口,在实现阶段不用关心代理者是谁,只有在运行阶段才会生成一个代理者。
- 声明接口
public interface Subject {
public void doSomeTing();
}
- 实现类
public class RealSubject implements Subject{
@Override
public void doSomeTing() {
System.out.println("call doSomeThing");
}
}
- 实现
InvocationHandler做一些具体的逻辑处理,invoke方法完成了对真是方法的调用。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
private Object realSubject;
public ProxyHandler(Object realSubject) {
this.realSubject = realSubject;
}
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
this.before();
Object result = arg1.invoke(realSubject, arg2);
this.after();
return result;
}
/**
* 预处理
*/
private void before() {
System.out.println("调用具体目标对象之前执行一些代码");
}
/**
* 善后处理
*/
private void after() {
System.out.println("调用具体目标对象之后执行一些代码");
}
}
- 通过
Proxy实现动态代理。
import java.lang.reflect.Proxy;
public class DynamicProxy {
public static void main(String[] args) {
RealSubject real = new RealSubject();
Subject proxySubject = (Subject) Proxy.newProxyInstance(
Subject.class.getClassLoader(),
new Class[] {Subject.class},
new ProxyHandler(real));
proxySubject.doSomeTing();
}
}
- 运行结果
调用具体目标对象之前执行一些代码
call doSomeThing
调用具体目标对象之后执行一些代码
二、反射简化 jOOR
当预期的工程非常多的使用到反射机制时,我们可以使用更加简化的工具来优化开发流程。 下面介绍 jOOR 实现代理的用法。
import org.joor.Reflect;
public class TestJoor {
public static void main(String[] args) {
// 反射创建真实对象
Reflect reflect = Reflect
.onClass(RealSubject.class)
.create();
// 创建代理
Subject subject = reflect.as(Subject.class);
// 调用方法
subject.doSomeTing();
}
}
也可简化成链式调用
Reflect
.onClass(RealSubject.class)
.create()
.as(Subject.class)
.doSomeTing();
运行结果
call doSomeThing