JDK的动态代理是如何实现的?

用Spring大概有3个月,一直都是张口AOP,闭口AOP,但是Spring的AOP具体是怎么实现的,现在也不是十分清楚.

只知道可以用JDK的动态代理,基于接口,或者是cglib方式字节码增强.目前对JDK的动态代理方式不是很理解,固拿出来探讨下,我知道这应该是个新手贴,但还是请大家给点意见.如果真正理解了动态代理,那么对基于Spring AOP出现的各种现象就比较容易理解了.

先贴上一段代码.

[code]package com.jamesby.proxy;
public interface CarCompany {

public void makeCar();
public void abc();
}

package com.jamesby.proxy;

public class CarCompanyImpl implements CarCompany {
public void makeCar() {
System.out.println("Company A make a car!");
abc();
}
public void abc()
{
System.out.println("abc is invoked!");
}
}

package com.jamesby.proxy;

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

public class CarCompanyHandler implements InvocationHandler {
CarCompany com;
public CarCompanyHandler(CarCompany com) {
this.com = com;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("time1:" + System.currentTimeMillis());
method.invoke(this.com, new Class[] {});
System.out.println("time2:" + System.currentTimeMillis());
return null;
}
}

package com.jamesby.proxy;

import java.lang.reflect.Proxy;

public class Test {
public static void main(String[] arg) {
CarCompanyImpl a = new CarCompanyImpl();
CarCompanyHandler handler = new CarCompanyHandler(a);
// 产生一个新的代理类
CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);
com.makeCar();
}
}[/code]


从以上代码可以看出在调用com.makeCar()的时候动态代理会生效,而在makeCar()方法中调用abc()的时候并不会进行动态代理.

猜测到底JDK是如何实现动态代理的?
1.基于JDK的反射机制,通过JDK调用handler的method.invoke(this.com, new Class[] {});实现对最终方法的调用,前后各有代码也有点Decorator的味道!

2.也是我比较模糊的一点
[code] CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);
com.makeCar();[/code]

也就是动态代理JDK到底是如何实现的?
JDK的动态代理并没有生成具体的类,她只是在运行中起动态调用目标类的作用,那么代码
[code]CarCompany com = (CarCompany) Proxy.newProxyInstance(Test.class
.getClassLoader(), new Class[] { CarCompany.class }, handler);[/code]
究竟做了什么,是将CarCompany注册到JDK的某个地方,当调用com.makeCar()的时候JDK到注册的地方去寻找,发现有注册就进行动态代理?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值