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应用的更多相关文章

  1. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  2. cglib动态新增类方法

    <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> & ...

  3. cglib动态代理

    代理即为访问对象添加一层控制层,使其间接化,控制层可以为对象访问添加操作属性. cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许 ...

  4. CGLib动态代理原理及实现

    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...

  5. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  6. Spring中的cglib动态代理

    Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...

  7. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  8. AOP学习心得&jdk动态代理与cglib比较

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  9. Java 的静态代理 动态代理(JDK和cglib)

    转载:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是 ...

  10. Java动态代理与Cglib库

    JDK动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在 ...

随机推荐

  1. B. OR in Matrix

    B. OR in Matrix time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. Palindromes

    http://acm.hdu.edu.cn/showproblem.php?pid=1318 Palindromes Time Limit: 2000/1000 MS (Java/Others)    ...

  3. a*b(mod m)的实现过程

    /*a*b (mod m) 的实现过程*/ /*当a,b很大的时候mod m就会产生溢出, 故运用乘法原理转换为加法求解*/ LL multi(LL a, LL b, LL m) { LL exp = ...

  4. Java入门篇(四)——数组

    上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合,根据维数不同可以分 ...

  5. 自写 zTree搜索功能 -- 关键字查询 -- 递归无限层

    唠叨一哈 前两天朋友跟我说要一个ztree的搜索功能,我劈头就是一巴掌:这种方法难道无数前辈还做少了?自己去找,我很忙~然后我默默地蹲着写zTree的搜索方法去了.为什么呢?因为我说了句“找不到是不可 ...

  6. chorme调试Paused in debugger问题解决

    最近出现的问题,使用chorme调试代码总是这个状态(Paused in debugger[debug的时候暂停了]): 一刷新就这样,非常的不舒服.当然你可以选择多按几次F8跳出,下面提供几种方式解 ...

  7. phpstudy php5.4以上版本伪静态设置 thinkphp

    http://www.thinkphp.cn/topic/35958.html <IfModule mod_rewrite.c> Options +FollowSymlinks -Mult ...

  8. 免费空间上的mysql数据库怎么连接?

    我申请了一个php的免费空间,空间有带mysql数据库,可是我不知道怎么连接. 平时在本地做php时我都是怎么连接的 可是现在到空间上了我就不知道怎么连接了.空间有提供phpmyadmin 会的教一下 ...

  9. 数据库DBUtils基本使用

    Apache-DBUtils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,使用dbutils能极大简化jdbc编码的工作量,同 ...

  10. SSH的jar包下载地址

    spring http://repo.spring.io/libs-release-local/org/springframework/spring/ 条理清晰的搭建SSH环境之添加所需jar包 ht ...