java 代理模式

本文深入探讨了Java动态代理的实现原理,包括其核心组件、目的、工作流程及使用场景。通过具体示例,展示了如何利用动态代理为类添加额外功能,实现代码的灵活扩展与维护。
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;
}


}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值