浅谈Java动态代理

来源:互联网 发布:ubuntu 关闭桌面 编辑:程序博客网 时间:2024/05/29 19:44

动态代理是Java设计模式“代理模式”中的一种实现方法,代理模式在以前的博客已经写过。这里就详细的说一说动态代理机制。

动态代理的关键类是Proxy(这个词的意思就是代理),关键接口是InvocationHandler(invocation是调用的意思,handler是处理器的意思)。动态代理的作用就是如果某个类的对象需要调用一些方法,动态代理使得我们无需new的创建拥有这些方法的对象,而是采用动态代理的方式创建该类的对象,这样创建的对象就拥有了需要调用的方法,因此关键就在于如何创建动态代理对象。客官,且看下面代码:

为了能够看清楚结构,我们尽量精简代码:

public interface IA //定义一个接口,该接口里有两个方法{public void method1();public void method2();}

public class A implements IA //定义IA的实现类A{@Overridepublic void method1(){System.out.println("这是第一个A类的方法");}@Overridepublic void method2() {System.out.println("这是第二个A类的方法");}}



public class B//定义一个B类,该类当中的方法需要在A中被调用 {public void B1(){System.out.println("B的第一个方法");}public void B2(){System.out.println("B的第二个方法");}}


import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class InvocationHandlerForA implements InvocationHandler //这是本程序的关键,可以理解为调用管理器{private Object target;//定义一个Object,要将A传入到该调用管理器中,作为targetpublic void setTarget(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {B b=new B();b.B1();//将b中的方法插入到A的执行方法中Object result=method.invoke(target, args);//这是最关键的代码,通过反射,以target作为主调执行方法b.B2();return result;}}



import java.lang.reflect.Proxy;public class ProxyForA //定义A的代理{public static Object getProxy(Object target){InvocationHandlerForA ih=new InvocationHandlerForA();ih.setTarget(target);//下面代码是本程序的关键,返回一个代理类,该代理类中传入target的类加载器,接口,以及调用管理器//这个返回的代理类就是我们需要使用的类,return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih);}}


下面来测试一下
import java.lang.reflect.Proxy;public class test{public static void main(String[] args) throws Exception{IA target=new A();//创建一个原有的A类,作为targetIA newA=(IA)ProxyForA.getProxy(target);//使用动态代理,创建新的A类,该类包含了插入的B的方法newA.method1();//测试一下,调用A的第一个方法newA.method2();//测试A的第二个方法}}

结果如下:B的第一个方法
这是第一个A类的方法
B的第二个方法
B的第一个方法
这是第二个A类的方法
B的第二个方法



0 0
原创粉丝点击