`
finux
  • 浏览: 202188 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

cglib学习 (2)

    博客分类:
  • Java
阅读更多

昨天写的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的实例~

0
1
分享到:
评论

相关推荐

    AOP-CGLIB学习-实现简单的注解权限系统

    标题中的"AOP-CGLIB学习-实现简单的注解权限系统"指的是使用Spring的面向切面编程(AOP)特性,结合CGLIB库来创建一个基于注解的权限控制系统。在这个系统中,通过CGLIB动态代理技术,可以对带有特定注解的方法进行...

    cglib_cglib.zip

    CGLib,全称为Code Generation Library,是一个强大的Java代码生成库,广泛用于动态代理、AOP...这个“cglib.zip”压缩包提供的内容,无论是源码还是文档,都值得我们去研究和学习,以便更好地利用CGLib解决实际问题。

    cglib.jar以及cglib-src.jar

    CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其...通过深入学习CGLIB的源码,开发者可以更好地掌握Java的动态代理机制,提高自己的编程技巧和问题解决能力。

    cglib-3.1源码

    2. **代理机制**:CGLIB通常用于实现动态代理,特别是在AOP(面向切面编程)场景中。它能够创建目标对象的代理类,拦截并增强调用方法的行为。对于那些不支持接口的目标对象,CGLIB提供了比Java动态代理更广泛的适用...

    Spring cglib 中文说明

    CGLIB 的基本代码量虽然不多,但由于缺乏充分的文档支持,学习起来可能会有一定难度。以下列出了 CGLIB 的主要组件: - **net.sf.cglib.core:** 提供低级别的字节码操作类;大部分与 ASM 相关。 - **...

    cglib包,源代码等

    2. **Enhancer**:这是CGLIB的核心类,用于生成代理对象。通过调用`Enhancer.create()`方法,可以创建一个代理对象,这个代理对象具有目标类的所有功能,并且可以添加自定义的行为。 3. **回调机制**:CGLIB通过`...

    CGLIB入门实例.doc

    2. **动态增强**:CGLIB的`Enhancer`类不仅能够创建代理对象,还能用于增强目标类的功能。我们可以通过`setCallback`方法设置拦截器,当调用被代理对象的方法时,实际上是调用了拦截器中的`intercept`方法。这样,...

    CGLIB动态代理jar包

    CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现...在学习和测试CGLIB时,可以尝试创建自己的拦截器,观察和理解其动态生成的字节码,以加深对其工作原理的理解。

    asm + cglib demo

    通过这些示例,你可以学习如何使用ASM和CGlib进行字节码操作,理解它们的工作原理,并将这些技术应用到实际项目中,提高代码的灵活性和可维护性。同时,掌握这两种工具也有助于深入理解Java的运行机制,提升作为Java...

    cglib代理jar包

    **正文** CGlib代理,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在...同时,它也是许多流行框架的底层技术支撑,学习和掌握CGlib的使用,无疑能够提高我们的技术水平和解决实际问题的能力。

    cglib.jar和cglib代理必备的asm所有jar

    Cglib是一个强大的高性能的代码生成库,它在Java运行时动态地为一个类创建子类,从而实现对这个类的功能扩展。...对于想要深入理解Java运行机制以及提升开发技能的程序员来说,学习和掌握这两个库是十分必要的。

    CGLib小练习题

    2. **Callback**:CGLib的回调机制,包括MethodInterceptor、FixedValue等接口。其中,MethodInterceptor是最常用的,我们可以通过实现这个接口的intercept()方法来拦截并处理目标方法的调用。 3. **ASM**:CGLib...

    cglib.jar源码

    总的来说,CGLIB是一个强大的字节码操作工具,对于理解和实现Spring AOP以及深入学习Java字节码技术具有重要意义。通过阅读和分析`cglib.jar`的源码,开发者可以更深入地理解CGLIB的工作原理,从而更好地利用它来...

    动态代理和cglib例子

    2. CGLIB:当目标对象没有实现接口或为了性能考虑(接口调用比子类方法调用稍慢)时,可以选择CGLIB。 总结,动态代理和CGLIB都是Java中实现AOP的关键技术,它们提供了在不修改源码的情况下扩展和增强已有功能的...

    cglib和asm jar包

    2. Callback:这是CGLIB中的回调接口,包括MethodInterceptor和FixedValue等。MethodInterceptor用于在方法调用前后添加自定义逻辑,而FixedValue则可以用来返回一个固定值。 3. MethodProxy:它是CGLIB提供的一个...

    CgLib动态代理所需的jar

    CgLib是一个强大的Java字节码库,它允许开发者在运行时动态地创建新的类或增强现有的类。在Java世界中,动态代理是一种常见的...因此,学习和使用CgLib不仅能提升开发效率,也能加深对面向切面编程和设计模式的理解。

    Cglib和ASM打包合集

    这个文件包含了Cglib的源代码,开发者可以查看和学习其内部实现,有助于理解Cglib的工作原理,也可以方便地进行调试和自定义修改。 **ASM:** ASM是一个Java字节码操控和分析框架,它可以用来动态生成类或者增强已...

    cglib + asm

    2. `cglib-docs-2.2.3.jar`:这是CGLIB的文档文件,可能包含了API文档和其他技术文档,可以帮助开发者更好地理解和使用CGLIB的各种功能。 3. `cglib-nodep-2.2.3.jar`:无依赖版本的CGLIB库,不包含ASM库和其他依赖...

    cglib 源代码分析(原创)

    通过阅读和分析源码,我们可以了解到字节码生成的具体步骤,学习到如何利用ASM进行字节码操作,以及如何在Java中实现高效动态代理。总的来说,CGlib是Java开发中的一个强大工具,对于理解和实现复杂的企业级功能至关...

    cglib-2.2.2 (含其他包)

    2. **cglib-nodep-2.2.2.jar**: 这个版本的CGLIB不依赖于任何其他的外部库,如Jakarta Commons Lang。如果你的应用程序希望最小化依赖关系,可以使用这个版本。然而,由于缺少一些依赖,某些高级功能可能无法使用...

Global site tag (gtag.js) - Google Analytics