`
QING____
  • 浏览: 2245833 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Cglib与反射机制代码样例

    博客分类:
  • JAVA
 
阅读更多

    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();
}

 

    FastClass.create(Class),每次都创建一个新的FastClass实例,并且这个方法是有很大性能开销的,如果有必要,可以讲fastClass的实例缓存起来;对于FastClass的创建过程,底层将根据TestObject.class字节码信息创建一个新的class,例如:com.test.TestObject$$FastClassByCGLIB$$8bdfd246;不过cglib对于一个类只会创建一次,然后在本地将class引用缓存起来,缓存为一个二级map,key依次为classLoader/原始的类全名(比如com.test.TestObject).
    fastMethod.getMethod(..)方法,并没有特别神奇的地方,直接调用了class.getMethod(...),然后输出一个新的Fastmethod实例,此处和class.getMethod形成差不多.不过每次都会new FastMethod().
    fastMethod.invoke()的性能大概是jdk自带的Method.invoke()的1.5倍左右,只是没有像Method那样进行太多的权限检测..
    尽管jdk的reflect中,对class的各种信息提供了cache,但是似乎这个cache的提升非常微弱.有个事情让我非常不解:
Class clazz = TestObject.class;
String testMethod = "testMethod";
Class[] ts = new Class[]{};
Method method = clazz.getMethod(testMethod, null);
Method method2 = clazz.getMethod(testMethod, null);
System.out.println(method == method2);//false here,why?
 同一个类,使用getMethod()返回的Method的实例竟然是不同的???那reflect中还人模狗样的使用了cache,这究竟是怎么个意思?
分享到:
评论

相关推荐

    java cglib和反射demo

    Java中的CGLib与反射是两种常用的动态代理技术,它们在实现面向切面编程(AOP)时发挥着重要作用。本文将深入探讨这两种技术,并通过一个简单的AOP demo来阐述它们的使用方法。 首先,让我们了解什么是CGLib。CGLib...

    java(cglib)动态代理样例

    总的来说,CGlib是Java动态代理的重要组成部分,尤其在处理未实现接口的类时,它提供了一种灵活且高效的方法来扩展和拦截代码行为。通过理解并熟练运用CGlib,开发者可以更好地设计和实现复杂的应用场景,如AOP...

    JavaEE源代码 cglib-2.1.3

    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包,源代码等

    ### CGLIB与Java动态代理的对比 1. **性能**:CGLIB生成的是字节码,通常比Java动态代理(基于接口)更快。 2. **使用范围**:Java动态代理只适用于实现了接口的类,而CGLIB适用于任何非final的类。 3. **灵活性**...

    AOP动态代理(反射机制)

    它通过将这些关注点与核心业务逻辑分离,实现代码的解耦,提高可维护性和复用性。动态代理是实现AOP的一种常见方式,特别是在Java中。 在Java中,动态代理主要涉及到两个类:java.lang.reflect.Proxy和java.lang....

    cglib + asm 强大的反射机制

    CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。

    CGLIB简介 CGLIB简介 CGLIB简介 CGLIB简介

    CGLIB与Java反射机制相比,有以下优势和劣势: - 优势:CGLIB无需目标类实现接口,即可创建代理对象,这在无法或不便修改源代码的情况下非常有用。此外,由于CGLIB是通过生成子类并覆盖方法实现的,所以调用代理方法...

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    CGLIB动态代理+CGLIB动态代理完整代码

    CGLIB是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。cglib通过继承方式实现代理,也就是基于类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。 我们最终是...

    cglib 源代码分析(原创)

    这篇原创文章“CGlib源代码分析”旨在深入探讨CGlib的工作原理和内部机制,帮助开发者更好地理解和利用这个工具。 首先,CGlib的核心功能是通过字节码技术动态生成类的子类。在Java中,由于语言设计的原因,我们...

    cglib_cglib3.2_remain3gr_cglibjar包_cglib.jar_

    CGLib(Code Generation Library)是一个强大的、高性能的代码生成库,它在运行期扩展Java类与实现Java接口。这个库最初是为EJB的透明代理而设计的,但后来发展成为了一个广泛的通用工具。CGLib的主要功能包括创建...

    JAVA JDK静态代理、动态代理、CGlib代理的代码演示

    CGlib(Code Generation Library)是一个强大的高性能的代码生成库,它在运行期扩展Java类与实现Java接口。当目标类不支持代理接口时,可以使用CGlib进行代理。CGlib通过创建目标类的子类并重写其中的方法来实现代理...

    cglib.jar以及cglib-src.jar

    CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。CGLIB是由Evan Schoolnik开发并维护的,它最初是作为Jakarta OGNL...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    JavaEE源代码 cglib-2.2_beta1

    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依赖jar包

    CGLIB,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界里被广泛应用,尤其是在Spring框架中。CGLIB是基于ASM(一个底层的Java字节码操作和分析框架)来实现的,它允许开发者在运行时...

    cglib.jar下载

    CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要...

Global site tag (gtag.js) - Google Analytics