Java动态代理

今天看了一下Java的动态代码,先不说Java设计模式中的动态代理模式,本文就Java中的代理类,简单说一下,帮助理解一下,希望支持!

先看个动态代理的使用例子:


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

public class TestProxy {
	public interface Ia {
		public void print();
	}

	public class IaImpl implements Ia {

		public void print() {
			System.out.println("IaImpl");
		}

	}

	public static void main(String[] args) {
		final Object obj = new TestProxy().new IaImpl();

		Ia instance = (Ia) Proxy.newProxyInstance(obj.getClass().getClassLoader(), new Class[] { Ia.class },
				new InvocationHandler() {

					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("invoke被调用");
						return method.invoke(obj, null);
					}
				});
		instance.print();// 调用这个方法的时候也调用了invoke方法
		System.out.println("instance是哪个类的对象?——" + instance.getClass().getName());
	}
}

输出结果:
invoke被调用
IaImpl
instance是哪个类的对象?——com.sun.proxy.$Proxy0

有时间大家会产生疑问 :invoke()方法是 怎么执行的?这里给解释一下(参考《深入理解JVM》中第9章的部分),由最后一个输出语句,我们可知,instance对象是代理类“Proxy”的class文件,反编译会得到:

..................

public final void print() throws{
    try{
            this.h.invoke(this, m2, null); //调用invoke方法
           return;
        }catch{
           ..................
         }
}

.....................




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bboyzqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值