Cglib中对jdk反射机制做了封装和调整,使用起来更加简单,同时性能也有所提升.如下为代码样例,基于cglib-2.1.3和asm-1.5.3:
1. 创建对象实例:
//通过cglib创建实例 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); //创建fastClass实例,底层将根据TestObject.class字节码信息创建一个新的class: //com.test.TestObject$$FastClassByCGLIB$$8bdfd246 //此FastClassByCGLIB类被加载后,将会被缓存起来 //缓存为一个二级map,key依次为classLoader/原始的类全名(比如com.test.TestObject) FastClass fastClass = FastClass.create(classLoader,TestObject.class); //-----------default constructor---------- FastConstructor defaultConstructor = fastClass.getConstructor(new Class[]{}); TestObject o1 = (TestObject)defaultConstructor.newInstance(); System.out.println(o1.testMethod()); //直接通过newInstance也可以创建对象,底层实现一样,找到默认的FastConstructor TestObject o2 = (TestObject)fastClass.newInstance(); System.out.println(o2.testMethod());
//------------paramter constuctor---------- FastConstructor paramsConstructor = fastClass.getConstructor(new Class[]{String.class}); TestObject o3 = (TestObject)paramsConstructor.newInstance(new Object[]{"newInstance"});//传递参数 System.out.println(o3.testMethod()); //通过newInstance方式 TestObject o4 = (TestObject)fastClass.newInstance(new Class[]{String.class},new Object[]{"newInstance"}); System.out.println(o4.testMethod());
2. 方法调用:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); TestObject testObject = new TestObject("testMethod"); FastClass fastClass = FastClass.create(classLoader,TestObject.class); //getMethod方法每次都会新建一个FastMethod对象,底层仍然继续jdk-reflect //和JDK-reflect相比此处性能并没有太多的提升. // FastMethod testMethod = fastClass.getMethod("testMethod", new Class[]{});//获得testMethod方法,无参数 //testMethod.getJavaMethod();//获取java api中Method引用 String result = (String)testMethod.invoke(testObject, null); System.out.println("invoke result:" + result);
//static method FastMethod staticMethod = fastClass.getMethod("testStaticMethod", new Class[]{}); staticMethod.invoke(null, null);
3. MethodDelegate样例:
/** * 简单代理(适配)工具, * 如果你的某个对象的"某个"方法,可以被某个接口所"delegate",那么你可以使用此方式. * 需要注意,"delegate"接口,只能被代理一个方法(即接口只能有一个方法,且签名和被代理者一致) * * 非常有用的方式,不过因为cglib内部缓存的机制,任何一个对象的同一个方法的delegate,事实上是同一个. */ public static void methodDelegate(){ TestObject testObject = new TestObject("methodDelegate"); //接口TestInterface与TestObject中,"testMethod"的签名和返回值类型必须一致. TestInterface delegate = (TestInterface)MethodDelegate.create(testObject, "testMethod", TestInterface.class); delegate.testMethod(); System.out.println(delegate.toString()); //静态方法 TestStaticInterface staticDelegate = (TestStaticInterface)MethodDelegate.createStatic(TestObject.class, "testStaticMethod", TestStaticInterface.class); staticDelegate.testStaticMethod(); } static interface TestInterface{ public String testMethod(); } static interface TestStaticInterface{ public String testStaticMethod(); }
相关推荐
Java中的CGLib与反射是两种常用的动态代理技术,它们在实现面向切面编程(AOP)时发挥着重要作用。本文将深入探讨这两种技术,并通过一个简单的AOP demo来阐述它们的使用方法。 首先,让我们了解什么是CGLib。CGLib...
总的来说,CGlib是Java动态代理的重要组成部分,尤其在处理未实现接口的类时,它提供了一种灵活且高效的方法来扩展和拦截代码行为。通过理解并熟练运用CGlib,开发者可以更好地设计和实现复杂的应用场景,如AOP...
JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源...
### CGLIB与Java动态代理的对比 1. **性能**:CGLIB生成的是字节码,通常比Java动态代理(基于接口)更快。 2. **使用范围**:Java动态代理只适用于实现了接口的类,而CGLIB适用于任何非final的类。 3. **灵活性**...
它通过将这些关注点与核心业务逻辑分离,实现代码的解耦,提高可维护性和复用性。动态代理是实现AOP的一种常见方式,特别是在Java中。 在Java中,动态代理主要涉及到两个类:java.lang.reflect.Proxy和java.lang....
CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...
CGLIB是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。cglib通过继承方式实现代理,也就是基于类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。 我们最终是...
这篇原创文章“CGlib源代码分析”旨在深入探讨CGlib的工作原理和内部机制,帮助开发者更好地理解和利用这个工具。 首先,CGlib的核心功能是通过字节码技术动态生成类的子类。在Java中,由于语言设计的原因,我们...
CGLib(Code Generation Library)是一个强大的、高性能的代码生成库,它在运行期扩展Java类与实现Java接口。这个库最初是为EJB的透明代理而设计的,但后来发展成为了一个广泛的通用工具。CGLib的主要功能包括创建...
CGlib(Code Generation Library)是一个强大的高性能的代码生成库,它在运行期扩展Java类与实现Java接口。当目标类不支持代理接口时,可以使用CGlib进行代理。CGlib通过创建目标类的子类并重写其中的方法来实现代理...
CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。CGLIB是由Evan Schoolnik开发并维护的,它最初是作为Jakarta OGNL...
### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...
CGLIB,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界里被广泛应用,尤其是在Spring框架中。CGLIB是基于ASM(一个底层的Java字节码操作和分析框架)来实现的,它允许开发者在运行时...
JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1...
CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要...