发布于2021-05-29 19:33 阅读(1235) 评论(0) 点赞(23) 收藏(0)
Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。
public class Proxy
Proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。
public interface InvocationHandler
InvocationHandler是由代理实例的调用处理程序实现的接口。
每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用将被编码并分配到齐调用处理程序的invoke方法。
- 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
- 公共业务就交给了代理角色,实现了业务的分工
- 公共业务发展扩展的时候,方便集中管理
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理类可以代理多各类,只要实现了同一个接口即可!
下面是一个动态代理的例子,仍然使用比较熟悉的例子(这里只用Demo3)
UserService.java
- package Demo3;
-
- public interface UserService {
- public void add();
- public void delete();
- public void update();
- public void query();
- }
UserServiceImpl.java
- package Demo3;
-
- public class UserServiceImpl implements UserService {
-
- public void add() {
- System.out.println("增加了一个用户");
- }
-
- public void delete() {
- System.out.println("删除了一个用户");
- }
-
- public void update() {
- System.out.println("修改了一个用户");
- }
-
- public void query() {
- System.out.println("查询了一个用户");
- }
- }
ProxyInvocationHandler.java
- package Demo3;
-
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
-
- // 我们会用这个类,自动生成代理类!
- public class ProxyInvocationHandler implements InvocationHandler {
-
- // 被代理的接口
- private Object target;
-
- public void setTarget(Object target){
- this.target = target;
- }
-
- //生成得到代理类
- public Object getProxy(){
- return Proxy.newProxyInstance(this.getClass().getClassLoader(),
- target.getClass().getInterfaces(), this);
- }
-
- // 处理代理实例,并返回结果
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- log(method.getName()); // 反射
- // 动态代理的本质,就是使用反射机制实现!
- Object result = method.invoke(target, args);
- return result;
- }
-
- public void log(String msg){
- System.out.println("loginfo: 执行了" + msg + "方法");
- }
- }
Client.java
- package Demo3;
-
- public class Client {
- public static void main(String[] args) {
- // 真实角色
- UserServiceImpl userService = new UserServiceImpl();
- // 代理角色,不存在
- ProxyInvocationHandler pih = new ProxyInvocationHandler();
- pih.setTarget(userService); // 设置要代理的对象
- // 动态生成代理类
- UserService proxy = (UserService) pih.getProxy();
- proxy.delete();
- }
- }
原文链接:https://blog.csdn.net/Aibiabcheng/article/details/117339565
作者:黑暗之神
链接:http://www.javaheidong.com/blog/article/207109/e2a4fefad7ff2304b2cf/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!