struts2权威指南 aop实现原理 笔误代码

关键字: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动态代理发表意见谢谢

    原文作者:AOP
    原文地址: https://blog.csdn.net/beyondsanli/article/details/83260691
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞