反射进阶

177 阅读1分钟

反射进阶

目录

一、Proxy 动态代理机制

Java 的反射机制提供了动态代理的实现。 代理模式的作用是为其他对象提供一种代理以控制这个对象的访问,而动态代理可以让我们不用去多实现一个接口,在实现阶段不用关心代理者是谁,只有在运行阶段才会生成一个代理者。

  1. 声明接口
public interface Subject {
	public void doSomeTing();
}
  1. 实现类
public class RealSubject implements Subject{
	@Override
	public void doSomeTing() {
		System.out.println("call doSomeThing");
	}
}
  1. 实现 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("调用具体目标对象之后执行一些代码");
	}

}
  1. 通过 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();
	}
}
  1. 运行结果
调用具体目标对象之前执行一些代码
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