# proxy **Repository Path**: kotlin_zone/proxy ## Basic Information - **Project Name**: proxy - **Description**: cglib proxy demo - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 为什么 Kotlin 使用 cglib 的 Enhancer 动态代理不生效? 源代码:[https://gitee.com/kotlin_zone/proxy](https://gitee.com/kotlin_zone/proxy) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200912003602221.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXZlcnNza3kyMDE1,size_16,color_FFFFFF,t_70#pic_center) ## Kotlin 代码 NG: ```kotlin package com.light.sword /** * @author: Jack * 2020-09-11 10:59 */ open class Hello { fun hello() { println("Hello") } } package com.light.sword import net.sf.cglib.proxy.MethodInterceptor import net.sf.cglib.proxy.MethodProxy import java.lang.reflect.Method import kotlin.jvm.Throws /** * @author: Jack * 2020-09-11 10:59 */ class HelloProxy : MethodInterceptor { @Throws(Throwable::class) override fun intercept(obj: Any?, p1: Method?, args: Array?, proxy: MethodProxy?): Any { println("Before") proxy?.invokeSuper(obj, args) println("After") return Any() } } package com.light.sword import net.sf.cglib.proxy.Enhancer fun main() { val enhancer = Enhancer() enhancer.setSuperclass(Hello::class.java) // 回调方法的参数为代理类对象 enhancer.setCallback(HelloProxy()) // 增强过的目标类 val enhancedHello = enhancer.create() enhancedHello as Hello enhancedHello.hello() } ``` output: Hello ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200912004231817.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3VuaXZlcnNza3kyMDE1,size_16,color_FFFFFF,t_70#pic_center) Debug的时候报错: ``` Method threw 'java.lang.ClassCastException' exception. Cannot evaluate com.light.sword.Hello$$EnhancerByCGLIB$$6db4e38.toString() ``` ## Java 代码是OK的: ```java package com.light.sword; /** * @author: Jack * 2020/9/11 15:29 */ public class WorldJ { public void world(){ System.out.println("World!"); } } package com.light.sword; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * @author: Jack * 2020/9/11 15:29 */ public class WorldJProxy implements MethodInterceptor { public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("Before"); methodProxy.invokeSuper(o, args); System.out.println("After"); return null; } } package com.light.sword; import net.sf.cglib.proxy.Enhancer; /** * @author: Jack * 2020/9/11 15:34 */ public class WorldJTest { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(WorldJ.class); enhancer.setCallback(new WorldJProxy()); WorldJ enhanceWorldJ = (WorldJ) enhancer.create(); enhanceWorldJ.world(); } } ``` output: Before World! After