java动态代理的方法
代理就是用a对象代替b对象做一些事情的意思,为什么需要代理呢?因为a可以做一些b做不了的事情
就是在调用b方法前调用a的其他方法做一些前提工作
代码如下
Dog.java是一个接口
package huang.de.wei; public interface Dog { public void info(); public void run(); }
GunDog.java实现Dog接口
package huang.de.wei; public class GunDog implements Dog { public void info() { System.out.println("我是一只猎狗"); } public void run() { // TODO Auto-generated method stub System.out.println("我在奔跑"); } }
DogUtil.java是动态代理a的一些方法,做些b对象做不了的事情
package huang.de.wei; public class DogUtil { public void menthod1(){ System.out.println("=====第一个通用方法======="); }; public void menthod2(){ System.out.println("======第二个通用方法======="); }; public void menthod3(){ System.out.println("======第san个通用方法======="); }; }
MyInvocationHandler.java做主要的处理,其中的invoke方法时主要处理过程,在里面可以自定义动态代理该做什么;
package huang.de.wei; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import org.omg.CORBA.portable.InvokeHandler; public class MyInvocationHandler implements InvocationHandler{ //需要被代理的对象 private Object target; public void setTarget(Object target){ this.target=target; } //执行动态代理的所有方法时,都会执行如下invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub DogUtil du=new DogUtil(); //执行du的方法method1 du.menthod1(); du.menthod3(); //以target作为主调来执行method方法,如果没有则不能执行GunDog里面的方法 Object result = method.invoke(target, args); //执行du的方法method2 du.menthod2(); System.out.println("invoke"); return result; } }
MyProxyFactory.java为指定的target动态创建代理对象
package huang.de.wei; import java.lang.reflect.Proxy; public class MyProxyFactory { //为指定的target动态创建代理对象 public static Object getProxy(Object target ){ //创建一个MyInvocationHandler对象 MyInvocationHandler handler= new MyInvocationHandler(); //为MyInvocation对象设置target对象 handler.setTarget(target); System.out.println("setTagget"); //创建并返回一个动态代理 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); } }
测试类
Test.java
package huang.de.wei; public class Test2{ /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //创建原始的GunDog作为target对象 Dog target = new GunDog(); //以指定的target对象来创建动态代理 Dog dog=(Dog)MyProxyFactory.getProxy(target); dog.info(); dog.run(); } }
运行Test2.java结果
setTagget
=====第一个通用方法=======
======第san个通用方法=======
我是一只猎狗
======第二个通用方法=======
invoke
=====第一个通用方法=======
======第san个通用方法=======
我在奔跑
======第二个通用方法=======
invoke

浙公网安备 33010602011771号