Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(moduleClass);
DefaultInterceptor defaultCallback = new DefaultInterceptor();
ModuleInterceptor moduleCallback = new ModuleInterceptor();
enhancer.setCallbacks(new Callback[] { defaultCallback, moduleCallback });
enhancer.setCallbackFilter(moduleCallback);
module = (Module) enhancer.create();
/**
* 默认拦截器。
*/
private class DefaultInterceptor implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable {
return proxy.invokeSuper(obj, args);
}
}
/**
* Module拦截器。
*/
private class ModuleInterceptor implements MethodInterceptor, CallbackFilter {
public int accept(Method method) {
if (Modifier.isAbstract(method.getModifiers()) && method.getName().startsWith("get")
&& (method.getName().length() > "get".length())
&& (method.getParameterTypes().length == 0)
&& !method.getReturnType().equals(Void.TYPE)) {
return 1;
}
return 0;
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable {
Object returnValue = null;
String methodName = method.getName();
Class returnType = method.getReturnType();
String objectName = methodName.substring("get".length());
if (Character.isUpperCase(objectName.charAt(0))) {
objectName = Character.toLowerCase(objectName.charAt(0)) + objectName.substring(1);
}
returnValue = resolver.getObject(objectName, returnType);
return returnValue;
}
}
分享到:
相关推荐
在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...
- **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...
CGlib是Java编程语言中的一个库,主要用于生成子类,以此实现对现有类的动态代理。它是基于ASM库,能够直接操作字节码,从而在运行时创建新类的实例。在Java中,CGlib是一个非常重要的工具,特别是在AOP(面向切面...
在Java中,有两种常见的动态代理方式:Java内置的Java.lang.reflect.Proxy类和第三方库如CGlib。Java内置的Proxy类需要目标类实现至少一个接口,然后才能创建代理对象。然而,如果目标类没有实现任何接口,我们就不...
CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下,Spring 会选择使用 JDK 动态代理,但是如果目标...
CGLIB通过字节码技术生成代理类,它在运行时动态地创建一个新的类,这个新类继承自目标类,并覆盖或增强目标类的方法。这样,我们就可以在代理类中添加AOP所需要的通知,从而实现切面的逻辑。 使用CGLIB进行动态...
总结来说,"cglib实现动态代理依赖jar包"中的asm-5.1.jar和cglib-3.2.4.jar是实现Java动态代理的重要工具,它们通过字节码技术实现了对类的无侵入式扩展和控制,是很多Java企业级框架的核心组成部分。
CGlib则是Java动态代理的一种实现方式,尤其是在不提供接口的情况下,它通过生成目标类的子类来实现动态代理。 在Java中,JDK自带的动态代理机制是基于接口的,如果被代理的类没有实现任何接口,那么就无法使用JDK...
CGLib通过生成目标对象的子类来实现代理,它会动态地创建一个新的类,这个类继承自目标类,并覆盖其方法以插入切面逻辑。CGLib的优点是它可以代理任何类,无需目标对象实现接口,但相比JDK动态代理,它的运行效率较...
3. **字节码生成**:CGLIB使用ASM库(一个Java字节码操控和分析框架)来生成和修改类的字节码,从而实现对目标类的动态代理。 **比较与选择** JDK动态代理简单易用,但仅限于代理实现接口的类。如果需要代理的类...
CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...
性能方面,CGLIB通常比JDK动态代理更快,因为它是基于字节码生成的子类,而JDK动态代理需要创建接口的实现类。但是,如果目标类已经实现了接口,JDK动态代理的性能开销相对较小,因为它避免了子类继承带来的额外成本...
- 如果目标类中包含静态方法,CGlib代理不会影响静态方法的行为。 总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者...
本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...
- **CGLIB代理**:CGLIB通过ASM生成一个继承自目标类的新类,这个新类覆盖了目标类的所有方法,并在这些方法内部调用拦截器链。在运行时,这个新类的实例作为代理对象。 5. **优缺点**: - JDK代理简单易用,但...
当目标类不支持接口时,CGlib可以创建目标类的子类,并在子类中拦截方法调用,从而实现动态代理。具体步骤如下: 1. 创建Enhancer对象:这是CGlib的核心类,它可以配置代理的创建过程,包括设置回调函数、代理类名...
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
动态代理提供了在运行时动态创建代理对象的能力,而 CGLib 使得代理机制可以应用于没有接口的类,提高了代码的灵活性和可扩展性。通过代理模式,我们可以将业务逻辑与辅助功能分离,让代码更加模块化,便于维护和...
当JDK动态代理无法满足需求,例如代理的目标类没有实现接口时,CGLIB就能派上用场。CGLIB是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。CGLIB通过生成子类并在子类的方法上织入增强代码...
2. CGLib代理项目: - src/main/java:包含目标类 - target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - 测试代码:展示如何使用Enhancer创建代理对象并调用方法 这...