JDK的动态代理,经常被用来动态地创建对象的代理。JDK的动态代理用起来非常简单,但是有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口,还可以使用cglib包来完成代理。
cglib的底层通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的代理类。所以基于cglib开发时需要引入cglib的jar包和ASM的jar包。
下面的例子是基于cglib-2.2.2.jar和asm-all-3.0.jar。
先是一个普通的java类:
package cglib; public class BookServiceBean {
public void create() {
System.out.println("create() is running !");
} public void query() {
System.out.println("query() is running !");
} public void update() {
System.out.println("update() is running !");
} public void delete() {
System.out.println("delete() is running !");
}
}
下面的类将基于cglib为上面的类生成一个代理:
这个类是重点,getDaoBean将返回一个代理, enhancer.setSuperclass(cls);指明了为cls生成代理, enhancer.setCallback(this);指明MyCglibProxy为拦截器,
intercept方法将拦截cls中的方法并作处理。
package cglib; 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 MyCglibProxy implements MethodInterceptor { public Enhancer enhancer = new Enhancer(); private String name; public MyCglibProxy(String name) {
this.name = name;
} public Object getDaoBean(Class cls) {
enhancer.setSuperclass(cls);
enhancer.setCallback(this);
return enhancer.create();
} @Override
public Object intercept(Object object, Method method, Object [ ] args,
MethodProxy methodProxy) throws Throwable {
System.out.println("MyCglibProxy is running!");
Object result = methodProxy.invokeSuper(object, args);
return result;
}
}
写一个简单的工厂:
package cglib; public class BookServiceFactory {
private BookServiceFactory() {
} public static BookServiceBean getProxyInstance(MyCglibProxy myProxy){
return (BookServiceBean)myProxy.getDaoBean(BookServiceBean.class);
}
}
写一个模拟的测试:
package cglib; public class Client { public static void main(String [ ] args) {
BookServiceBean service1 = BookServiceFactory.getProxyInstance(new MyCglibProxy("boss"));
service1.create();
BookServiceBean service2 = BookServiceFactory.getProxyInstance(new MyCglibProxy("john"));
service2.create();
service2.query();
}
}
上面的例子,只是在调用方法前输出一句话,实际意义不大。
现在希望只有用户名为boss时才有权限调用方法,否则告诉用户权限不够。
将MyCglibProxy修改如下:
package cglib; 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 MyCglibProxy implements MethodInterceptor { public Enhancer enhancer = new Enhancer(); private String name; public MyCglibProxy(String name) {
this.name = name;
} public Object getDaoBean(Class cls) {
enhancer.setSuperclass(cls);
enhancer.setCallback(this);
return enhancer.create();
} @Override
public Object intercept(Object object, Method method, Object [ ] args,
MethodProxy methodProxy) throws Throwable {
//用户进行判断
if (!"boss".equals(name) ) {
System.out.println("你没有权限!");
return null;
}
System.out.println("MyCglibProxy is running!");
Object result = methodProxy.invokeSuper(object, args);
return result;
}
}
运行Client发现运行结果已经不同与上次。
现在是boss和所有的人都有query方法的权限,可以将MyCglibProxy再做修改:
@Override
public Object intercept(Object object, Method method, Object [ ] args,
MethodProxy methodProxy) throws Throwable {
//用户进行判断
if (!"boss".equals(name) && !method.getName().equals("query")) {
System.out.println("你没有权限!");
return null;
}
System.out.println("MyCglibProxy is running!");
Object result = methodProxy.invokeSuper(object, args);
return result;
}
cglib应用的更多相关文章
-
基于Spring AOP的JDK动态代理和CGLIB代理
一.AOP的概念 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...
-
cglib动态新增类方法
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> & ...
-
cglib动态代理
代理即为访问对象添加一层控制层,使其间接化,控制层可以为对象访问添加操作属性. cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许 ...
-
CGLib动态代理原理及实现
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...
-
java反射 cglib asm相关资料
有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...
-
Spring中的cglib动态代理
Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...
-
【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】
一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...
-
AOP学习心得&;jdk动态代理与cglib比较
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...
-
Java 的静态代理 动态代理(JDK和cglib)
转载:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是 ...
-
Java动态代理与Cglib库
JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在 ...
随机推荐
-
CURL HELP
CURL下载 在windows的系统环境变量中,将CURL的路径(curl.exe存放的路径)复制到"Path"变量的结尾 Usage: curl [options...] < ...
-
Java复习-oop
我们可理解“纯粹”的面向对象程序设计方法是什么样的:(1) 所有东西都是对象.可将对象想象成一种新型变量:它保存着数据,但可要求它对自身进行操作.理论上讲,可从要解决的问题身上提出所有概念性的组件,然 ...
-
Linux cd命令
1: cd 不加任何参数,它会自动跳到用户的家目录中去! 2: ~ 表示用户的家目录 3: cd ~userNmae/ 这样可以进入指定用户的家目录中去! 4: cd - 跳到上一次所在的目 ...
-
TypeScript开发ReactNative之fetch函数的提示问题
使用TypeScript开发ReactNative时,发现在类中调用 fetch 函数时IDE可能会提示找不到,无法加载,特别是当类中存在同名的 fetch 成员方法时更是郁闷了,虽然程序是可以执行的 ...
-
常用FastJSON的SerializerFeature特性及日期转换格式
SerializerFeature.PrettyFormat:格式化输出 SerializerFeature.WriteMapNullValue:是否输出值为null的字段,默认为false Seri ...
-
Linux下ftp和ssh详解
学习了几天Linux下ftp和ssh的搭建和使用,故记录一下.学习ftp和ssh的主要目的是为了连接远程主机,并且进行文件传输.废话不多说,直接开讲! ftp服务器 1. 环境搭建 本人的系统是Arc ...
-
ebook
libgen.io onlybooks.org www.ebook3000.com www.foxebook.net
-
51Nod:1268 和为K的组合
1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K.如果可以 ...
-
GridControl详解(九)表格中的控件
选择完成控件后,可用+号点开ColumnEdit列,改控件的类型是RepositoryItem类型的,其相应的属性和相应的控件属性是类似的 构建数据如下: DataTable dt = new Dat ...
-
visual studio NuGet
http://www.cnblogs.com/dudu/archive/2011/07/15/nuget.html 首先打开程序包管理器控制台:工具→Nuget程序包管理器→程序包管理器控制台 Ins ...