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();
}
}
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();
}
}
相关文章推荐
- java 集合排序(Comparable、Comparator)
- Java利器之UML类图详解
- 2 java数组总结
- 深入理解 Java G1 垃圾收集器
- Java常用类
- 3 java字符串总结
- tips:Java基本数据类型大小比较
- Java 获取当前时间往前推最近12月“年-月”格式的时间,方便统计使用
- 8 javaI/O总结
- java正则表达式不以某个字符串开头或结尾
- 使用Eclipse将Android项目打Library包
- 玩转Eclipse — 自动代码规范检查工具Checkstyle
- 10 Java并发编程1总结
- Java的final笔记
- Eclipse中的checkstyle插件
- 9 java枚举总结
- 从头学Java【1】
- Java的io流使用
- 7 java反射总结
- 6 java泛型总结