java动态代理

  一直对动态代理很陌生,总以为是很高深的东西,就像java的反射一样,然而真正去实现之后,也就那么回事,怕自己遗忘,故整理一下思绪,记录在此。

package com.zhj;

public  interface Cat {
//    建立Cat接口,之前我好奇,把接口换成抽象类后,取代理对象的时候
//    出现ClassCastException.

     void eat(int num);
     void sleep(int hour);
}
 

 实现类:

package com.zhj;

public class LazyCat implements Cat {

    public void eat(int num) {
        System.out.println("I eat "+num+" fishes every day");
    }

    public void sleep(int hour) {
        System.out.println("I sleep "+hour+" hours every day");

    }


}

插入日志的接口和实现类:

package com.zhj;

public interface LogUtil {
    public void beforeMethod();
    public void testLazyCat(int sum);
}
package com.zhj;

public class LogUtilImp implements LogUtil {

    @Override
    public void beforeMethod() {
        System.out.println("method begin");
        System.out.println("---------------");
    }

    @Override
    public void testLazyCat(int num) {
        System.out.println("---------------");
        if(num>8){
            System.out.println("It is a lazy cat!");
        }
        else{
            System.out.println("It is a good cat!");
            
        }
    }

}

接下来是重头戏了:实现InvocationHandle接口,就只有一个invoke方法,内部利用反射完成对方法的调用。

package com.zhj;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {
    // prepare the target to  proxy,用于注入被代理对象
    private Object target;
    public void setTarget(Object target){
        this.target=target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        LogUtil lu=new LogUtilImp();
        //在方法前调用日志
        lu.beforeMethod();
        //java反射,target为被代理对象,args是方法传入的参数数组对象
        Object result=method.invoke(target, args);
        
        //方法后调用日志类方法,并且还能传递传入方法的参数
        lu.testLazyCat((Integer)args[0]);
        
        return result;
    }

}
package com.zhj;

import java.lang.reflect.Proxy;

public class MyProxy {
    public static Object getProxy(Object target){
    //实例化自定义handler
    MyInvocationHandler handler=new MyInvocationHandler();
    //注入被代理对象
    handler.setTarget(target);
    //生成代理对象
    return Proxy.newProxyInstance(target.getClass().getClassLoader()
            , target.getClass().getInterfaces(), handler);
    }


}

Test:

package com.zhj;

public class Test {
    public static void main(String[] args){
        //new 一个lazyCat
        Cat target=new LazyCat();
        //拿到代理“懒猫”,此懒猫已非彼懒猫,每调用一个方法,方法前后都被加了日志
        Cat cat=(Cat) MyProxy.getProxy(target);
        
        cat.sleep(12);
        
    }

}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。