Java中如何实现代理机制(JDK、CGLIB)
代理分为两种:
1.静态代理
2.动态代理
动态代理又分为两种:jdk 实现 ;Cglib 实现
3.Java中如何实现代理机制(JDK、CGLIB)
JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。
CGLIB动态代理:代理类是目标类的子类,用到MethodInterceptor接口。
注意:
使用版本:
首先介绍jdk 实现动态代理:
第一步:建立接口
package com.asiainfo.proxydemo;
public interface BookFacade {
public void addBook();
}
第二步:实现接口
package com.asiainfo.proxydemo;
import java.io.Serializable;
public class BookFacadeImpl implements BookFacade, Serializable {
public void addBook() {
// TODO Auto-generated method stub
System.out.println("增加图书方法。。。");
}
}
第三步:建立代理类
package com.asiainfo.proxydemo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class BookFacadeProxy implements InvocationHandler {
private Object target;
public Object bind(Object target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), (Class<?>[]) target.getClass().getGenericInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object result=null;
System.out.println("事物开始执行");
method.invoke(target, args);
System.out.println("事情结束");
return null;
}
//代码测试
public static void main(String[] args) {
BookFacade target = new BookFacadeImpl();
BookFacade bookFacadeProxy = (BookFacade) new BookFacadeProxy().bind(target);
bookFacadeProxy.addBook();
}
}
其次是Cglib 实现:
第一步:
package com.asiainfo.proxydemo;
public class BookFacadeCglib {
public void addBook(){
System.out.println("addBook");
}
}
第二步:cglib 建立测试类
package com.asiainfo.proxydemo;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class BookFacadeProxyCglib implements MethodInterceptor {
private Object target;
public Object getInstance(Object target){
this.target=target;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.target.getClass());
//回调方法
//enhancer.setCallbackType(this.target.getClass());
enhancer.setCallback(this);
//创建代理对象
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
System.out.println("before run");
Object returnvalue=proxy.invokeSuper(obj, args);
System.out.println("after run");
return null;
}
//cglib代码测试
public static void main(String[] args) {
BookFacadeCglib target = new BookFacadeCglib();
BookFacadeCglib bookFacadeCglib = (BookFacadeCglib) new BookFacadeProxyCglib().getInstance(target);
bookFacadeCglib.addBook();
}
}
参考:http://lrd.ele.me/2017/01/09/dynamic_proxy/
:https://blog.csdn.net/einstein10147/article/details/77040110
Java中如何实现代理机制(JDK、CGLIB)相关推荐
- 吃透Java中的动态代理
动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...
- Java中的等待/通知机制(wait/notify)
为什么80%的码农都做不了架构师?>>> 当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...
- Java中事件监听机制
Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...
- 什么是多态,JAVA 中多态的实现机制
什么是多态,JAVA 中多态的实现机制 首先声明啊,这里的多态不是生物学和物理学上的多态性,这个是指编程语言中的多态. 官方说明: 多态(英语:polymorphism)指为不同数据类型的实体提供统一 ...
- java中设置网络代理
代理服务器概述 许多系统通过代理服务器访问Web,有时还会访问Internet的其它非HTTP部分.代理服务器接收到本地客户端到远程服务器的请求.代理服务器向远程服务器发出请求,再将结果转发回本地客户 ...
- Java基础-Java中常用的锁机制与使用
Java基础-Java中常用的锁机制与使用 锁lock或互斥mutex是一种同步机制,主要用于在存在多线程的环境中强制对资源进行访问限制.锁的主要作用为强制实施互斥排他以及并发控制策略.锁一般需要硬件 ...
- 一篇文章搞定java中的垃圾回收机制面试题
一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新 ...
- java中实现多态的机制是什么_java多态机制是什么
java多态机制是什么 java中实现多态的机制是依靠父类或接口的引用指向子类.从而实现了一个对象多种形态的特性.其中父类的引用是在程序运行时动态的指向具体的实例,调用该引用的方法时,不是根据引用变量 ...
- Java中的原生动态代理和CGLIB动态代理的原理,我不信你全知道!
作者:CarpenterLee cnblogs.com/CarpenterLee/p/8241042.html 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询 ...
最新文章
- DL-5 深度学习框架的对比
- maven项目编译漏掉src/main/java下的xml配置文件
- 关于fckEditor的功能配置-PHP版
- linux bool变量,Objective-C中的占位符,打印BOOL类型数据
- 记录下最近使用到的sql语句
- matplotlib之legend图例和标注(笔记三)
- 将 vCenter Server vSphere 软件从 VMware vSphere 6.5 升级到 6.7
- struts2错误:The Struts dispatcher cannot be found.
- 最大公约数 [2011年哈尔滨工业大学计算机研究生机试真题]
- c# 调用java webservice 参数获取不到_用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值!...
- windows10安装ninja过程记录
- MAC APP 签名证书查看
- 浏览器插件开发--获取淘宝的品牌类型
- 手把手教你vue中如何使用TradingView
- vue+element 实现时间选择器切换周月选择
- 基于ATTCK框架解析勒索病毒攻击
- 使用python打造一个中英互译软件(基于有道翻译)
- VS2017中自用部分插件的设置的翻译或功能介绍—— Viasfora设置(一)
- tyvj p1004 滑雪
- ug8.0更改计算机名,Ug8.0电脑名改了怎么处理