动态署理的简单实现

动态代理的简单实现

-------------------------------------------------
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
说明h不能为空
创建类的步骤
-------------------------------------------------
第一,创建一个接口,例如A.java,
public interface A {
/*定义目标方法*/
public void text();

}
-------------------------------------------------
第二,创建接口的实现类,例如AImpl.java
public class AImpl implements A {

public AImpl() {

}
/*目标方法的实现*/
public void text() {
System.out.println("你好");
}

}
-------------------------------------------------
第三,创建一个实现了InvocatioinHandler接口的实现类 AInvocationHandler.java
InvocatioinHandler该接口位于java.lang.reflect,只提供了一个invoke方法
public class AInvocationHandler implements InvocationHandler {
private Object a;

public Object getA() {
return a;
}

public void setA(Object a) {
this.a = a;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//调目标方法,在这里是调用text方法,如果没有此句,那么就不会打印输出“你好
Object obj = method.invoke(a, args);
return obj;//在这里返回void
}
public AInvocationHandler() {
}

}
-------------------------------------------------

第四,提供获取代理对象的方法getAProxy(Object proxy),为了方便,该方法位于AProxyFactory中
public class AProxy {
public static Object getAProxy(Object proxy){
AInvocationHandler aih = new AInvocationHandler();
aih.setA(proxy);
//proxy.getClass().getInterfaces(),获得proxy类中所有的接口,为每个接口生成一个代理类
return Proxy.newProxyInstance(AImpl.class.getClassLoader(), proxy.getClass().getInterfaces(), aih);//返回代理
}

public AProxy() {

}

}
---------------------------------------------------

测试
public class Text {
public static void main(String[] args){

A a = new AImpl();
A aProxy = null ;
//获得a的代理
Object o = AProxy.getAProxy(a);

if(o instanceof A){
aProxy = (A)o;
}

//代理类调用目标方法,可以再该句打个断点,然后调试,看看执行流程
aProxy.text();
}
}
-------------------------------------------------

注意通过动态代理的应用对spring中切面的理解