作者shensy及出处http://shensy.iteye.com/blog/1887625
--------------------------------------
实战CGLib系列文章
本篇介绍接口生成器InterfaceMaker。
一、作用:
InterfaceMaker会动态生成一个接口,该接口包含指定类定义的所有方法。
二、示例:
比较简单,先定义一个类,仍使用本系列第一篇中的那个ConcreteClassNoInterface类,该类包含3个方法:
- public class ConcreteClassNoInterface {
- public String getConcreteMethodA(String str){
- System.out.println("ConcreteMethod A ... "+str);
- return str;
- }
- public int getConcreteMethodB(int n){
- System.out.println("ConcreteMethod B ... "+n);
- return n+10;
- }
- public int getConcreteMethodFixedValue(int n){
- System.out.println("getConcreteMethodFixedValue..."+n);
- return n+10;
- }
- }
用这个类内定义的方法来生成一个接口:
- InterfaceMaker im=new InterfaceMaker();
- im.add(ConcreteClassNoInterface.class);
- Class interfaceOjb=im.create();
- System.out.println(interfaceOjb.isInterface());//true
- System.out.println(interfaceOjb.getName());//net.sf.cglib.empty.Object$$InterfaceMakerByCGLIB$$13e205f
interfaceOjb就是InterfaceMaker生成的接口,从接口名字可以看出。
看一下该接口内部的方法:
- Method[] methods = interfaceOjb.getMethods();
- for(Method method:methods){
- System.out.println(method.getName());
- }
Method[] methods = interfaceOjb.getMethods(); for(Method method:methods){ System.out.println(method.getName()); }
输出结果,与ConcreteClassNoInterface类内定义的方法完全相同:
- getConcreteMethodA
- getConcreteMethodB
- getConcreteMethodFixedValue
getConcreteMethodA getConcreteMethodB getConcreteMethodFixedValue
下面通过生成的接口,可以对某个类进行Enhancer(本系列前面介绍过Enhancer,此处不再讲解)。
- Object obj = Enhancer.create(Object.class, new Class[]{ interfaceOjb },
- new MethodInterceptor() {
- public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
- return "intercept!";
- }
- });
- Method method = obj.getClass().getMethod("getConcreteMethodA", new Class[]{String.class});
- System.out.println(method.invoke(obj, new Object[]{"12345"}));
Object obj = Enhancer.create(Object.class, new Class[]{ interfaceOjb }, new MethodInterceptor() { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { return "intercept!"; } }); Method method = obj.getClass().getMethod("getConcreteMethodA", new Class[]{String.class}); System.out.println(method.invoke(obj, new Object[]{"12345"}));
此处让Object生成的代理类实现了由InterfaceMaker生成的接口,但是由于Object类并没有覆写其中的方法,因此,每当对生成接口内方法进行MethodInterceptor方法拦截时,都返回一个字符串,并在最后打印出来。
相关推荐
Maven坐标:cglib:cglib-nodep:3.1; 标签:cglib、nodep、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变...
CGlib(Code Generation Library)是Java编程语言中的一个开源项目,主要用于代码的动态生成。它在许多场景下被广泛使用,特别是在实现Java的动态代理机制时。动态代理是一种技术,允许我们在运行时创建一个对象的...
Cglib就是一种实现动态代理的方式,不同于JDK自带的Proxy,Cglib不需要目标对象实现任何接口,因此可以用于不能实现接口的对象。通过Enhancer类,我们可以指定需要代理的目标类,并提供回调方法实现动态代理逻辑。 ...
2. **接口回调**:对于接口,CGLib可以使用`Enhancer`类配合`Callback`接口来创建代理对象。这种方式更加灵活,但要求目标类必须实现至少一个接口。 关键组件和接口包括: - **Enhancer**:这是CGLib的主要入口点...
- **支持未实现接口的类:** JDK 动态代理要求代理对象必须实现一个或多个接口,而 CGLIB 则可以直接代理任何实现了非 `final` 方法的类。 - **高性能:** 由于它是通过字节码操作来实现方法的拦截,因此性能优于...
Maven坐标:cglib:cglib:3.1; 标签:cglib、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...
CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在运行期扩展Java类与实现Java接口。在Java编程中,我们有时需要在运行时动态地创建或修改类,CGLib就是为此目的而设计的。它广泛应用于...
CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。这个库的主要功能是能够在运行时动态创建类或者增强已有类的功能...
CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要...
Cglib是一个强大的Java代码生成库,主要用于动态创建子类,是Java编程中不可或缺的工具之一,尤其在AOP(面向切面编程)和ORM(对象关系映射)框架中广泛应用。Cglib是由Eclipse的AspectJ项目开发团队维护的,它能够...
CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理、AOP(面向切面编程)等领域。这个“cglib实现动态代理依赖jar包”包含了两个核心的JAR文件:...
- JDK Proxy基于接口实现,而CGLIB基于继承,因此CGLIB可以代理没有接口的类。 - JDK Proxy性能相对较慢,因为涉及到反射,而CGLIB通过字节码生成,性能更好。 - JDK Proxy易于理解和使用,CGLIB则需要更深入的...
2. 使用Proxy.newProxyInstance()方法生成代理对象,传入接口的Class对象数组、InvocationHandler实例以及加载器。 3. 通过代理对象调用接口方法,实际上会触发InvocationHandler的invoke()方法。 **Cglib代理** ...
JDK的Proxy类依赖于接口,只能为实现了特定接口的类生成代理,而CGlib则无需接口,通过生成目标类的子类来实现代理,因此对于没有接口的类,CGlib更具优势。 CGlib的核心组件包括: 1. **Enhancer**:这是CGlib的...
Cglib是一个强大的高性能的代码生成库,它在Java运行时可以动态地生成子类,扩展已有对象的功能,而无需实现接口或继承原有类。在Java中,动态代理主要有两种方式:一是通过Java的反射API实现,二是通过第三方库如...
当你看到"COULD NOT FIND cglib:cglib-2.2.2"这样的错误信息时,这意味着你的Maven或Gradle构建系统在尝试构建项目时无法找到这个特定版本的cglib依赖。这通常是由于以下原因造成的: 1. **本地Maven仓库中缺失该...
Maven坐标:cglib:cglib-nodep:3.2.4; 标签:cglib、nodep、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...
CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被使用,如Spring AOP和dynaop等。它允许动态地为一个类创建子类,从而实现方法的拦截。CGLIB是通过字节码技术来实现的,它在运行时为Java类...