我试图用cglib增强j​​ava.util.Date.它没有用,我对cglib没有经验,所以我想知道出了什么问题.

例如,以下代码增强了ArrayList的工作原理:

@Test
public void enhance_ArrayList() {

    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(ArrayList.class);
    enhancer.setCallback(new FixedValue() {
                @Override
                public Object loadobject() throws Exception {
                  return "Hello cglib!";
                }
              });

    ArrayList enhanced = (ArrayList)enhancer.create();
}

而以下代码:

@Test
public void enhance_Date() {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(Date.class);
    enhancer.setCallback(new FixedValue() {
                @Override
                public Object loadobject() throws Exception {
                  return "Hello cglib!";
                }
              });

    Date enhanced = (Date)enhancer.create();
}

导致此异常:

java.lang.IllegalArgumentException  
at org.objectweb.asm.ClassReader.<init>(UnkNown Source)
at org.objectweb.asm.ClassReader.<init>(UnkNown Source)
at org.objectweb.asm.ClassReader.<init>(UnkNown Source)
at net.sf.cglib.proxy.BridgeMethodResolver.resolveAll(BridgeMethodResolver.java:61)
at net.sf.cglib.proxy.Enhancer.emitMethods(Enhancer.java:911)
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:498)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)

解决方法

您似乎在版本8中使用JDK,其中包含版本8中的类文件.cglib不支持这些类文件,因为此库依赖于过时的 ASM版本.

要对此进行调试,我们必须注意ASM不包含任何调试信息,并且不在其堆栈跟踪中提供所有信息.我们所知道的是,从其ClassReader的构造函数(名为< init>)抛出了IllegalArgumentException.查看源代码可以发现这种异常只有一种可能性.从ASM 4.2的源代码(used by the latest version of cglib)中,我们可以看到,如果类文件是ASM版本未知的版本,则仅抛出此类异常:

// checks the class version
if (readShort(off + 6) > Opcodes.V1_7) {
  throw new IllegalArgumentException();
}

不幸的是,没有为此错误提供短信,没有真正原因导致为什么不是这种情况,但我们必须忍受这一点.要修复此错误,您需要一个依赖于支持Java 8的ASM 5的cglib版本.

截至今天,有一个no compatible version of cglib available,因为cglib是not really maintained anymore.你可能想尝试alternative library such as Byte Buddy(注意我写了这个库,无耻插件).增强功能可以是这样的:

new ByteBuddy().subclass(Date.class)
  .method(named("toString"))
  .intercept(FixedValue.value("Hello World!"))
  .make()
  .load(getClass().getClassLoader(),ClassLoadingStrategy.Default.WRAPPER)
  .getLoaded()
  .newInstance();

这将覆盖toString方法,因为Byte Buddy不允许您定义具有非法返回值的类.

增强java.util.Date类时,cglib会抛出IllegalArgumentException的更多相关文章

  1. Spring Boot Bean:构造函数中传递的值在构造函数中不为null,但在CGLIB代理中为null

    我在Kotlin中实现了以下存储库:具有以下基类:运行集成测试时,我得到一个异常,因为dao为空。我注意到对象引用不一样,但我不知道构造函数调用和创建代理bean之间发生了什么。我尝试了在SapArticleRepository中实现的抽象函数getDaoImpl()和调用该方法,但这似乎过于复杂。必须有一种方法来传递构造函数参数/字段,使其在使用Bean时仍然存在。注意TrmSapArticleDao只是Jooq生成的类。

  2. java – mockito如何创建模拟对象的实例

    当我创建一个类Employee的模拟对象.它不会调用Employee对象的构造函数.我知道内部Mockito使用cglib和反射,创建一个代理类,将类扩展为mock.如果它没有调用employee的构造函数,那么employee类的mock实例是如何创建的?

  3. java – 如何调试Spring AOP

    有没有像springaop那样的详细标志,这给了这些信息?解决方法在SpringAOP类中似乎没有太多的日志记录代码,但…如果SpringAOP决定使用cglib来创建代理,那么有一行可以帮助你:当使用JDK代理时,类似的一个似乎很方便:只需尝试打开这两个类的DEBUG级别日志记录,看看是什么输出.

  4. java – 如何防止假阳性空指针警告,当使用CGLIB / Spring AOP?

    我在SpringMVC控制器中使用SpringAOP,因此间接地使用cglib.由于cglib需要一个默认构造函数,所以我包括一个,我的控制器现在看起来像这样:现在的问题是,IntelliJIDEA的静态代码分析报告了潜在的NullPointerException,因为this.exampleService可能为null.我的问题是:如何防止这些假阳性空指针警告?一个解决方案是添加assertth

  5. 增强java.util.Date类时,cglib会抛出IllegalArgumentException

    我试图用cglib增强java.util.Date.它没有用,我对cglib没有经验,所以我想知道出了什么问题.例如,以下代码增强了ArrayList的工作原理:而以下代码:导致此异常:解决方法您似乎在版本8中使用JDK,其中包含版本8中的类文件.cglib不支持这些类文件,因为此库依赖于过时的ASM版本.要对此进行调试,我们必须注意ASM不包含任何调试信息,并且不在其堆栈跟踪中提供所有信息.我们

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部