您的位置:首页 > 编程语言 > Java开发

JDK的动态

2017-01-14 17:23 363 查看
JDK的动态代理是通过是实现接口进行动态代理的,如果没有实现接口,就不能进行JDK的代理

CGLIB的动态代理是通过类,因为是通过创建子类拦截父类的调用技进行遮盖,所以类不能是final

举例说明:

=============================================接口

//接口

public interface MoveInterface

{

void move();

}

//实现接口

=============================================实现接口

public class Car implements MoveInterface()

{

public void move(){

syso(“是实现接口”);

}

}

//实现jdk动态代理中额处理器,时间

===============================实现接口InvocationHandler,添加时间

public class TimeHandler implements InvocationHandler(){

//获取参数

public TimeHandler(Object target){

this.target=target;

}

private Object target;

//实现接口InvocationHandler

//poxy代理本身

//method 被代理对象的反射方法

//args 被代理对象的参数

public Object invoke(Object poxy,Method method,Object[] args){

//通过反射获取被代理对象的方法,如果被代理的对象有参数可以添加上参数,method.invoke(target,args);

method.invoke(target);

syso();

}

return null;//因为代理对象没有返回结果就不用返回结果了

}

========================实现InvocationHander添加日志

public class LogHanlder implenents InvocationHandler(){

//获取参数

public Handler(Object target){

this.target=target;

}

private Object target;

public Obejct invoke(Obejct proxy,Method method,Obejct[] args){

syso("开始日志");

method.invoke(target);

syso("日志结束");

}

return null;

}

======================================测试结果

public Test(){

main(){

Car car=new Car();

Class<?> list=car.getClass();

InocationHandler time=new TimeHandler(car);

//创建代理类,因为实现类和动态代理都是实现的接口,动态代理的类还是原来的接口

//第一个参数是被代理对象的加载器

//第二个参数是实现的接口

//第三个参数是InvocationHandler

被实现的类名       类名=(被实现的类名)Proxy.newProxyInstance(list.getClassLoader(),list.getInterface(),time);

InvocationHanlder log=new LogHandler(类名);

                               类名=(被实现的类名)Proxy.newProxyInstance(list.getClassLoader(),list.getInterface(),log);

 //获取被代理类的方法

类名.move();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: