昨天写的cglib学习留下个问题善未实践:
对cglib的总结中有写到:
“3. 该默认的constractor建议不要声明为private,毕竟,按照刚刚的方式来操作是会抛Error的哦;
对于第3点,把samples.Beans放在samples.Bean里面作为一个内部类,不知会是啥情况呀,呵呵。。。有点晚了,明儿再试试看~睡觉去罗”
今天试了下,将默认的constractor声明为private确实不行,不过,找到另一种方式来达到这样一个效果:
1. 控制其他的coder使用new创建被代理的类;
2. 使用一个工厂方法来创建被代理的类的实例;
达到上述效果可作如下要求:
1. 将要被代理的类声明为abstract;
2. 将要被代理的类的默认constractor声明为private;
3. 提供一个static newInstance()来创建被代理的类实例;
4. Enhancer.setSuperclass()创建一个匿名的内部类,且extends被代理的类;
下面就是这种方式的具体实现:
package cglib.test;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* 被代理的类声明为abstract
* @author zhu
*
*/
public abstract class Hello {
/**
* constractor声明为private不让其他类继承
*/
private Hello() { }
/**
* 一些接口/方法,可以声明为abstract好让将要创建的匿名的内部子类去实现
*/
public void sayHello(){ }
/**
* 工厂方法提供唯一接口用于创建Hello的实例
* @return
*/
public static Hello newInstance() {
Enhancer enhancer = new Enhancer();
//创建匿名内部类并继承自cglib.test.Hello
enhancer.setSuperclass(new Hello() {
public void sayHello() {
System.out.println("Hello, World~");
}
}.getClass());
//需要拦截的类,可以选择不用内部类实现,这里偷懒用匿名类实现了~
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("before " + method.getName() + "() invoke");
Object result = proxy.invokeSuper(obj, args);
System.out.println("after " + method.getName() + "() invoke");
return result;
}
});
//这里也偷情没有进行try/catch了
return (Hello)enhancer.create();
}
public static void main(String[] args) {
//just for test
Hello hello = Hello.newInstance();
hello.sayHello();
}
}
呵呵。。。达到了要求的效果吧,只有一个入口即cglib.test.Hello.newInstance()来创建Hello的实例~
分享到:
相关推荐
AOP-CGLIB学习-实现简单的注解权限系统
cglib实现动态代理所依赖的jar包 在学习spring中会用到
JDK动态代理必须提供接口才能使用,在一些不能提供接口的环境中,只能采用其他第三方技术,比如CGLIB动态代理,这里提供CGLIB动态代理的相关jar包,供学习和测试使用。
NULL 博文链接:https://whp0731.iteye.com/blog/357032
com.springsource.net.sf.cglib-sources-2.2.0.jar
主要介绍了Spring如何基于Proxy及cglib实现动态代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
截至2016.11.25 github最新版spring 导入 myclipse/eclipse时缺少的jar包。找了很久不容易,这里分享给诸位一起学习spring的朋友!
NULL 博文链接:https://coolszy.iteye.com/blog/540457
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
spring2.0测试学习所需要的jar
通过学习它们的原理和实际应用,您将能够更好地理解和利用Spring AOP来提高您的应用程序的可维护性和可扩展性。 内容亮点: JDK动态代理: 我们将详细介绍JDK动态代理的概念和工作原理。您将了解如何使用Java的...
CGLIB代理 通过前面的学习可知,JDK的动态代理用起来非常简单,但它是有局限性的,使用动态代理的对象必须实现一个或多个接口。 那么,如何代理没有实现接口的类? CGLIB代理 CGLIB(Code Generation Library)是一...
Proxy 模式学习代码,包括静态代理,动态代理,cglib等
jvm虚拟机源码学习资料 配置jar包:cglib-2.2.2.jar
主要介绍了Java使用JDK与Cglib动态代理技术统一管理日志记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
[Spring]基于Spring框架的Web应用演示(附带cglib工具进行动态代理) [Tomcat7.0]Tomcat7版本安装包 [UltraISO]制作U盘启动盘需要的 [log4j_jar]log4j的支持包 [myAutoLoginWeb]过滤器Filter学习-实现用户的自动...
学习springmvc专用,包含 spring.jar、spring-webmvc.jar、commons-logging.jar、cglib-nodep-2.1_3.jar hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、antlr-2.7.6.jar、commons-collections-3.1、dom4...
学习spring所需要的jars c3p0-0.9.1.jar com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar commons-logging-...
spring2.5学习PPT 传智博客 01_全面阐释Spring及其各项功能 02_搭建与测试Spring的开发环境 03_编码剖析Spring管理Bean的原理 04_Spring的三种实例化Bean的方式 05_配置Spring管理的bean的作用域 06_Spring...