java动态代理- 三

 

Java代码 复制代码
  1. public interface HelloWorld {   
  2.     void sayHelloWorld();   
  3. }  
public interface HelloWorld {
	void sayHelloWorld();
}

 
 
业务接口实现:

Java代码 复制代码
  1. public class HelloWorldImpl implements HelloWorld {   
  2.     public void sayHelloWorld() {   
  3.         System.out.println("Hello World!");                
  4.     }   
  5. }  
public class HelloWorldImpl implements HelloWorld {
	public void sayHelloWorld() {
		System.out.println("Hello World!");             
	}
}

 
 

InvocationHandler实现,需要在接口方法调用前后加入一部份处理工作,这里仅仅在方法调用前后向后台输出两句字符串,其代码如下:

Java代码 复制代码
  1. import java.lang.reflect.InvocationHandler;   
  2. import java.lang.reflect.Method;   
  3.   
  4. public class HelloWorldHandler implements InvocationHandler {   
  5.   
  6.     //要代理的原始对象   
  7.     private Object objOriginal;   
  8.     /**  
  9.      * 构造函数。  
  10.      * @param obj 要代理的原始对象。  
  11.      */  
  12.     public HelloWorldHandler(Object obj) {   
  13.         this.objOriginal = obj ;   
  14.     }   
  15.   
  16.     /**  
  17.      * 当调用原始对象的方法时,代理执行的方法  
  18.      * @param proxy 代理对象  
  19.      * @param method 要执行的原始对象方法  
  20.      * @param args 原始对象方法的参数值组  
  21.      * @return 原始对象方法执行的返回值  
  22.      */  
  23.     public Object invoke(Object proxy, Method method, Object[] args)   
  24.         throws Throwable {   
  25.             Object result ;    
  26.             //方法调用之前   
  27.             doBefore();   
  28.             //调用原始对象的方法   
  29.             result = method.invoke(this.objOriginal ,args);   
  30.             //方法调用之后   
  31.             doAfter();   
  32.             return result ;   
  33.     }   
  34.     /**  
  35.      * 方法调用之前执行的方法  
  36.      */  
  37.     private void doBefore() {   
  38.         System.out.println("before method invoke!");   
  39.     }   
  40.        
  41.     /**  
  42.      * 方法调用之后执行的方法  
  43.      */  
  44.     private void doAfter() {   
  45.         System.out.println("after method invoke!");   
  46.     }   
  47. }   
  48.   
  49. 测试代码:   
  50.   
  51. import java.lang.reflect.InvocationHandler;   
  52. import java.lang.reflect.Proxy;   
  53.   
  54. public class Test {   
  55.     public static void main(String[] args) {   
  56.         HelloWorld hw = new HelloWorldImpl();   
  57.                  
  58.         InvocationHandler handler = new HelloWorldHandler(hw);   
  59.                  
  60.         HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(    
  61.             hw.getClass().getClassLoader(),    
  62.             hw.getClass().getInterfaces(),    
  63.             handler);    
  64.         proxy.sayHelloWorld();   
  65.     }   
  66. }  
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class HelloWorldHandler implements InvocationHandler {

	//要代理的原始对象
	private Object objOriginal;
	/**
	 * 构造函数。
	 * @param obj 要代理的原始对象。
	 */
	public HelloWorldHandler(Object obj) {
		this.objOriginal = obj ;
	}

	/**
	 * 当调用原始对象的方法时,代理执行的方法
	 * @param proxy 代理对象
	 * @param method 要执行的原始对象方法
	 * @param args 原始对象方法的参数值组
	 * @return 原始对象方法执行的返回值
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
		throws Throwable {
			Object result ; 
			//方法调用之前
			doBefore();
			//调用原始对象的方法
			result = method.invoke(this.objOriginal ,args);
			//方法调用之后
			doAfter();
			return result ;
	}
	/**
	 * 方法调用之前执行的方法
	 */
	private void doBefore() {
		System.out.println("before method invoke!");
	}
	
	/**
	 * 方法调用之后执行的方法
	 */
	private void doAfter() {
		System.out.println("after method invoke!");
	}
}

测试代码:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {
	public static void main(String[] args) {
		HelloWorld hw = new HelloWorldImpl();
              
		InvocationHandler handler = new HelloWorldHandler(hw);
              
		HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance( 
			hw.getClass().getClassLoader(), 
			hw.getClass().getInterfaces(), 
			handler); 
		proxy.sayHelloWorld();
	}
}

  
 

1.首先获取一个业务接口的实现对象;

2.获取一个InvocationHandler实现,此处是HelloWorldHandler对象;

3.创建动态代理对象;

4.通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl. sayHelloWorld()方法前后输出两句字符串。

运行测试类输出如下:

before method invoke!
Hello World!
after method invoke!
 
此处Test类中的方法调用代码比较多,在我们的实际应用中可以通过配置文件来来简化客户端的调用实现。另外也可以通过动态代理来实现简单的AOP。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值