一接口和实现类
interface Subject {
public void hello();
}
class RealSubject implements Subject {
@Override
public void hello() {
System.out.println("hello");
}
}
二、创建代理实现类
class DynamicProxy implements InvocationHandler {
// 代理的真实对象
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
// 当代理对象调用真实对象的方法时,其会自动执行代理对象关联的handler对象的invoke方法来进行调用,
// 无论何时调用代理对象的方法,调用处理器的 invoke 方法都会被调用, 并向其传递Method 对象和原始的调用参数。 调用处理器必须给出处理调用的方式
method.invoke(target, args);
System.out.println("after");
return null;
}
}
三、测试代码
class ProxyTest {
public static void main(String[] args) {
Subject realSubject = new RealSubject();
InvocationHandler invocationHandler = new DynamicProxy(realSubject);
/*
* 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数
* 第一个参数 类加载器 handler.getClass().getClassLoader() ,我们这里使用realSubject这个类的ClassLoader对象来加载我们的代理对象
* 第二个参数 一个class对象数组,每个元素都要实现的接口。我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
* 第三个参数 一个调用处理器 invocationHandler, 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
* */
Subject proxy = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(), invocationHandler);
proxy.hello();
//realSubject.hello();
}
}