import java.lang.reflect.Proxy;
A. 创建一个实现接口InvocationHandler的类,他必须实现invoke方法
B. 创建被代理的类以及接口。
C. 通过Proxy的静态方法newProxyInstance(ClassLoader loader,Class【】interfaces,InvocationHandler handler)创建一个代理
D. 通过代理调用方法。
---------------------
代理的目的:增加功能(在对客户类和服务类代码没有影响的情况下添加功能)
在客户类和服务类(委托类)之间(或者调用类和实现类)添加更能 通过在客户类和服务类之间加层的方式实现对客户类和服务类代码没有影响的情况下增加更能
可以嵌套多层 实现添加多个更能(如日志和权限)
原则:代理类和委托类具有相似的行为(隐式的增加功能 -------> 实现统一的接口,在客户类看来调用的是接口定义的属性(多态),客户类不必知道底层怎么实现)
代理类要增强委托类的行为(代理类需要拥有委托类的引用,并且写自己的代码 还调用委托类的方法)
动态代理:程序运行时 运用反射机制动态创建而成
Proxy
生成代理的实例
classLoader 默认唯一的 随便哪个类都行 : UserDaoFactory.class.getClassLoader(),
代理类和委托类具有相似的行为 实现相同的接口 ,UserDaoImpl.class.getInterfaces(),//委托类所实现的所有的接口。
回调函数 implements InvocationHandler : new LogHandler(new UserDaoImpl())
Proxy.newProxyInstance(UserDaoFactory.class.getClassLoader(),
UserDaoImpl.class.getInterfaces(),
new LogHandler(new UserDaoImpl())
)
public class LogHandler implements InvocationHandler {
private Object service; //委托类
//覆盖空构造 在new本类对象的时候传入委托类引用
public LogHandler(Object service) {
this.service = service;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("记录日志。。。。。。");
System.out.println(method.getName());
Object result =method.invoke(service, args); //调用委托类的method 把args传到委托类
return result;
}
}
A. 创建一个实现接口InvocationHandler的类,他必须实现invoke方法
B. 创建被代理的类以及接口。
C. 通过Proxy的静态方法newProxyInstance(ClassLoader loader,Class【】interfaces,InvocationHandler handler)创建一个代理
D. 通过代理调用方法。
---------------------
代理的目的:增加功能(在对客户类和服务类代码没有影响的情况下添加功能)
在客户类和服务类(委托类)之间(或者调用类和实现类)添加更能 通过在客户类和服务类之间加层的方式实现对客户类和服务类代码没有影响的情况下增加更能
可以嵌套多层 实现添加多个更能(如日志和权限)
原则:代理类和委托类具有相似的行为(隐式的增加功能 -------> 实现统一的接口,在客户类看来调用的是接口定义的属性(多态),客户类不必知道底层怎么实现)
代理类要增强委托类的行为(代理类需要拥有委托类的引用,并且写自己的代码 还调用委托类的方法)
动态代理:程序运行时 运用反射机制动态创建而成
Proxy
生成代理的实例
classLoader 默认唯一的 随便哪个类都行 : UserDaoFactory.class.getClassLoader(),
代理类和委托类具有相似的行为 实现相同的接口 ,UserDaoImpl.class.getInterfaces(),//委托类所实现的所有的接口。
回调函数 implements InvocationHandler : new LogHandler(new UserDaoImpl())
Proxy.newProxyInstance(UserDaoFactory.class.getClassLoader(),
UserDaoImpl.class.getInterfaces(),
new LogHandler(new UserDaoImpl())
)
public class LogHandler implements InvocationHandler {
private Object service; //委托类
//覆盖空构造 在new本类对象的时候传入委托类引用
public LogHandler(Object service) {
this.service = service;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("记录日志。。。。。。");
System.out.println(method.getName());
Object result =method.invoke(service, args); //调用委托类的method 把args传到委托类
return result;
}
}
本文深入探讨了Java动态代理的实现原理,包括其核心组件、目的、工作流程及使用场景。通过具体示例,展示了如何利用动态代理为类添加额外功能,实现代码的灵活扩展与维护。
2417

被折叠的 条评论
为什么被折叠?



