动态代理笔记
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Subject{
public void request();
}
/**
* 真实角色
* @author Administrator
*
*/
class RealSubject implements Subject{
@Override
public void request() {
System.out.println("Real Subject!");
}
}
/**
* 动态代理
* @author Administrator
*
* 该代理类的内部属性是Object的,这样才能起到动态代理的作用
* invoke方法中的method.invoke方法就是调用被代理对象的将要执行的方法,在本例中就是request()方法
* 方法的参数是object,表示该方法为传入对象的方法。
*
* 通过动态对象代理类,我们可以在执行真实对象的方法前后加入自己的一些方法,
* 应用:Spring中的AOP,面向切面编程
*/
class DynamicSubject implements InvocationHandler{
private Object object;
public DynamicSubject(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before");
method.invoke(object,args);
System.out.println("end");
return null;
}
}
public class ProxyTest {
public static void main(String[] args) throws Exception{
RealSubject realSubject = new RealSubject();
InvocationHandler invocationHandler = new DynamicSubject(realSubject);
Class<?> clazz = invocationHandler.getClass();
//下面是两步实现, 生成代理
//返回代理实例的Class对象。
Class proxyClass = Proxy.getProxyClass(
clazz.getClassLoader(),realSubject.getClass().getInterfaces()) ;
//返回一个代理
Subject subject2 = (Subject) proxyClass.getConstructor(
InvocationHandler.class).newInstance(new Object[]{invocationHandler});
subject2.request();
//下面是一步实现,生成代理
Subject subject1 = (Subject) Proxy.newProxyInstance(
clazz.getClassLoader(),realSubject.getClass().getInterfaces(),invocationHandler);
subject1.request();
}
}