关键字:struts2 ,aop实现原理
最近在学习李刚老师的struts2权威指南 ,从书的内容上看感觉李刚老师有丰富的开发经验。
不过在学习到213页关于aop拦截器的实现原理代码中,感觉有个笔误的地方!
拦截器的实现原理JDK的动态代理
/**
* 因为Dog 动态代理只能对实现了接口的实例来生成代理
* @author Administrator
*
*/
public interface Dog {
public void info();
public void run();
}
public class DogImpl implements Dog {
public void info()
{
System.out.println("我是一个猎狗");
}
public void run()
{
System.out.println("我奔跑速度");
}
}
/**
* 拦截器类
* @author Administrator
*
*/
public class DogIntercepter {
public void method1()
{
System.out.println("===模拟通用方法一");
}
public void method2()
{
System.out.println("===模拟通用方法二=======");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler{
private Object target;//被加入切面的对象
DogIntercepter di=new DogIntercepter();
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO 自动生成方法存根
Object result=null;
if(method.getName().equals("info"))
{
di.method1();//切面
result=method.invoke(target, args);
//可以动态的调用目标对象的方法
di.method2();
}
else
{
result=method.invoke(target, args);
}
return result;
}
public void setTarget(Object o)
{
this.target=o;
}
}
在下面的代理工厂中有点感觉不是很理想应该是笔误了
import java.lang.reflect.Proxy;
/**
* 该代理工厂的主要作用是根据目标对象生成一个代理的对象
* @author Administrator
*
*/
public class MyProxyFactory {
public static Object getProxy(Object object)
{
Class cls=object.getClass();
ProxyHandler handler=new ProxyHandler();
handler.setTarget(object);//
return Proxy.newProxyInstance(DogImpl.getClassLoader(), object.getClass().getInterfaces(), handler);//handler
//代理工厂负责根据目标对象和对应的拦截器生成新的代理对象
//代理对象中的方法是目标方法和拦截器方法的组合
}
}
特更改为
import java.lang.reflect.Proxy;
/**
* 该代理工厂的主要作用是根据目标对象生成一个代理的对象
* @author Administrator
*
*/
public class MyProxyFactory {
public static Object getProxy(Object object)
{
Class cls=object.getClass();
ProxyHandler handler=new ProxyHandler();
handler.setTarget(object);//
return Proxy.newProxyInstance(cls.getClassLoader(), object.getClass().getInterfaces(), handler);//handler
//代理工厂负责根据目标对象和对应的拦截器生成新的代理对象
//代理对象中的方法是目标方法和拦截器方法的组合
}
}
public class TestDog {
public static void main(String args[])
{
Dog targetObject=new DogImpl();
Dog dog=null;
Object proxy=MyProxyFactory.getProxy(targetObject);
if(proxy instanceof Dog)
{
dog=(Dog)proxy;
}
dog.info();
dog.run();
}
}
欢迎大家积极对struts2拦截器原理以及jdk动态代理发表意见谢谢