java动态代理(传送门)

大佬的博客传送门,CSDN上好像有人转了,但是我没找到,所以这是博客园的

https://www.cnblogs.com/xiaoluo501395377/p/3383130.html

这篇文章讲得很好了,只是有些地方有点不同的意见

1、InvocationHandler:

    这个应该是动态代理类的Invocation handler(调用处理器)需要实现的接口,而不是动态代理类要实现的接口

2、文章中的 DynamicProxy 应该理解为一个Invocation Handler(调用处理器),而不应该理解成动态代理类

3、这里的proxy不是真实的类,应该是动态代理类,打印后可以发现它就是文章中所说的$Proxy0

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}

个人见解,如有错误望指出。下面是一个Demo(编程思想上的):

(1)公共接口

interface Interface{
    void f();
    void g(String s);
}

(2)真实类,真正调用的是该类的方法

class RealObject implements Interface{
	public void f() {
		System.out.println("RealObject.f()");
	}
	public void g(String s) {
		System.out.println("RealObject.g() "+s);
	}
}

(3)一个InvocationHandler的实现,在动态代理上所做的调用都会重定向到这个invocation handler(调用处理器)上

class DynamicProxyHandler implements InvocationHandler{
	private Object proxied;
	public DynamicProxyHandler(Object proxied) {
		this.proxied = proxied;
	}
	/**
	 * proxy是动态代理对象
	 * method是真实对象的某个方法的Method对象
	 * args是调用真实对象方法时接受的参数
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
	    System.out.println("proxy:"+proxy.getClass());
		System.out.println("method:"+method);
		System.out.println("args:"+args);
		if(args != null)
			for(Object arg:args)
				System.out.println(" "+arg);
		return method.invoke(proxied, args);
        //调用method的invoke方法实际就是执行proxied对象对应的方法
	}
}
//这里的输出:
//proxy:class psl.rtti.study.$Proxy0
//method:public abstract void psl.rtti.study.Interface.f()
//args:null
//proxy:class psl.rtti.study.$Proxy0
//method:public abstract void psl.rtti.study.Interface.g(java.lang.String)
//args:[Ljava.lang.Object;@6bc7c054
// hahahahahaha

(4)

class SimpleDynamicProxy{
    public static void consumer(Interface iface){
        i.f();
        i.g("hahahahaha");
    }
    public static void main(String[] args){		
        RealObject real = new RealObject();
		InvocationHandler handler = new DynamicProxyHandler(real);

		/*
		 * Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces,         
         * InvocationHandler h)
		 * 该方法返回一个动态代理对象,该对象实现了第二个参数中的接口
		 * 使用动态代理对象调用代理的方法时,会被重定向到第三个参数的InvocatonHandler h上
		 * 并自动调用 h中的invoke方法
		 */

		Interface proxy = (Interface)Proxy.newProxyInstance(RealObject.class.getClassLoader(),
				new Class[] {Interface.class}, handler);
		System.out.println(proxy.getClass().getName());
		consumer(proxy);
    }
}
//这里的部分输出:
//psl.rtti.study.$Proxy0
//RealObject.f()
//RealObject.g() hahahahahaha

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值