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

posted @ 2017-04-19 11:09  一枚IT散人  阅读(721)  评论(0)    收藏  举报