动态代理

    一 为什么要用动态代理设计模式呢?
    比如下面的例子中,在MyClass中,有个方法doMethod().在一般的项目或者系统中,Class你是看不到他的源代码的。而仅仅给你调用他的接口MyInterface.此时如果你想在doMethod()方法中加一段代码,比如打印日志消息,增加权限判断,这个时候该怎么办?如何在不修改源代码并且在没有源代码的情况下实现呢?这个时候动态代理模式我们就用上了.
    下面有4个类.我想不用我一一指出,有基本功的朋友们,应该能看懂吧.其中有个你要修改的方法类.一个该方法类的接口.一个代理对象,还有一个当然就是测试用的main方法了.
    其中,代理类MyInterceptor是实现的核心.但实现方法都是固定的.只要根据你的需求,按照我下面的示例摸板代码,你很快的就能够实现自己的动态代理模式.
    二 核心思想与概念
连接点(Joinpoint): 程序执行的某个特定位置, 比如方法调用前后, 类初始化前,异常抛出之后.
增强(Advice): 植入到目标类的连接点上的程序代码.
目标对象(Target): 被植入增强的类, 比如上面简化之后的BookService.
代理(Proxy): 被植入增强之后产生的结果类.
1)代理对象实现InvocationHandler接口
2)通过Proxy.newProxyInstance来调用
    把下面的代码拷贝到你自己的机器上,开心的运行一次吧^-^

Java代码 复制代码  收藏代码
  1. //MyClass.java  
  2. //实现接口的类  
  3. public class MyClass implements MyInterface {  
  4.   
  5.     public void doMethod() {  
  6.         System.out.println("do my method!");  
  7.     }  
  8. }  
//MyClass.java
//实现接口的类
public class MyClass implements MyInterface {

	public void doMethod() {
		System.out.println("do my method!");
	}
}



Java代码 复制代码  收藏代码
  1. //MyInterceptor.java  
  2. import java.lang.reflect.InvocationHandler;  
  3. import java.lang.reflect.Method;  
  4.   
  5. //代理对象  
  6. public class MyInterceptor implements InvocationHandler {  
  7.       
  8.     private Object target;  
  9.       
  10.     public Object getTarget() {  
  11.         return target;  
  12.     }  
  13.   
  14.     public void setTarget(Object target) {  
  15.         this.target = target;  
  16.     }  
  17.   
  18.     public void beforeMethod(Method m) {  
  19.           
  20.         System.out.println(m.getName() + " start");  
  21.     }  
  22.       
  23.     public Object invoke(Object proxy, Method m, Object[] args)  
  24.             throws Throwable {  
  25.         beforeMethod(m);  
  26.         m.invoke(target, args);  
  27.         return null;  
  28.     }  
  29. }  
//MyInterceptor.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

//代理对象
public class MyInterceptor implements InvocationHandler {
	
	private Object target;
	
	public Object getTarget() {
		return target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

	public void beforeMethod(Method m) {
		
		System.out.println(m.getName() + " start");
	}
	
	public Object invoke(Object proxy, Method m, Object[] args)
			throws Throwable {
		beforeMethod(m);
		m.invoke(target, args);
		return null;
	}
}



Java代码 复制代码  收藏代码
  1. //MyInterface.java  
  2. //接口  
  3. public interface MyInterface {  
  4.     public void doMethod();  
  5. }  
//MyInterface.java
//接口
public interface MyInterface {
	public void doMethod();
}


Java代码 复制代码  收藏代码
  1. //Test.java  
  2. import java.lang.reflect.Proxy;  
  3.   
  4. //具体实现  
  5. public class Test {  
  6.     public static void main(String[] args) {  
  7.         MyInterface myInterface = new MyClass();  
  8.         MyInterceptor myInterceptor = new MyInterceptor();  
  9.         myInterceptor.setTarget(myInterface);  
  10.         MyInterface miProxy = (MyInterface) Proxy.newProxyInstance(myInterface.getClass().getClassLoader(),  
  11.                 new Class[] { MyInterface.class }, myInterceptor);  
  12.   
  13.         miProxy.doMethod();  
  14.     }  
  15.   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值