JDK动态代理

JDK代理必须要借助一个接口才能产生代理对象。

定义接口:

public interface User {
    void say(String str);
    void haha();
}

定义接口实现类:

public class UserImp implements User {
    @Override
    public void say(String str) {
        System.out.println("asd"+str);
    }

    @Override
    public void haha() {
        System.out.println("哈哈");
    }
}

动态代理类(必须实现InvocationHandler接口的invoke方法 ):

public class JDKProxy implements InvocationHandler {
	 // 需代理的对象target 
    private Object target =null;

	/*
	* 获取代理对象
	*       newProxyInstance方法的三个参数:
	*               1. 需代理的对象的类加载器
	*               2. 需代理的对象的接口(将代理对象挂在这个接口上)
	*               3. 一个执行代理逻辑的对象(该对象必须实现InvocationHandler接口)
	* */
	public Object getProxy(Object obj){
	    target= obj;
	    return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
	}

    /*
    *  执行代理逻辑,代理对象proxy(挂在User接口下)每调用接口方法时,都是通过调用invoke去调用。
    * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理前的逻辑");
        // 这里执行真实的方法
        Object obj = method.invoke(target, args);
        System.out.println("代理后的逻辑");
        return obj;
    }
}

测试类:

/*
* JDK代理
* */
@Test
public void test(){
    JDKProxy jdk = new JDKProxy();
    // 产生代理对象
    User proxy = (User)jdk.getProxy(new UserImp());

    // 调用真实方法
    proxy.haha();
    proxy.say("asdasda");
}

结果:
false
代理前的逻辑
哈哈
代理后的逻辑
代理前的逻辑
asdasdasda
代理后的逻辑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章