在Java项目进行增量更新的时候经常会出现java.lang.NoSuchMethodError的问题,究其原因有很多:
1、在引包是引用了不匹配的包版本
2、开发环境和运行环境的不一致
3、以上两点都齐全,并且确实有对应的方法存在,依然报java.lang.NoSuchMethodError错误
。。。
本文章主要解决第三种问题:对应的方法存在却依然报java.lang.NoSuchMethodError错误
错误重现:
搭建Java工程,并生成如下两个类
TestNoSuchMethodError用于测试
package com.timen.demo; public class TestNoSuchMethodError { public static void main(String[] args) { Person p = new Person(); p.setName("timen"); p.setSuperUser(true); System.out.println(p.getName() + " is Super User? " + p.isSuperUser()); } }Person
package com.timen.demo; public class Person { private String name; private boolean superUser; public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isSuperUser() { return superUser; } public void setSuperUser(boolean superUser) { this.superUser = superUser; } }注意:该类的superUser属性为boolean原生数据类型
执行TestNoSuchMethodError,结果如下:
D:\MyWorkspace\sts\NoSuchMethodError\bin>java com.timen.demo.TestNoSuchMethodError timen is Super User? true D:\MyWorkspace\sts\NoSuchMethodError\bin>将这两个类的编译后的Class文件(包括包目录)保存到其他目录下(相当于发布工程到正式环境中),然后修改Person类
package com.timen.demo; public class Person { private String name; private Boolean superUser; public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean isSuperUser() { return superUser; } public void setSuperUser(Boolean superUser) { this.superUser = superUser; } }注意:这里将superUser属性的类型改为Boolean(boolean的封装类型)
然后将编译后的Person.class拷贝到刚刚发布的项目中替换掉刚才的Person.class文件(注意你没有更改TestNoSuchMethodError类,所以大多你不会想更新这个类)
问题发生了:
D:\temp>java com.timen.demo.TestNoSuchMethodError Exception in thread "main" java.lang.NoSuchMethodError: com.timen.demo.Person.setSuperUser(Z)V at com.timen.demo.TestNoSuchMethodError.main(TestNoSuchMethodError.java:7) D:\temp>报出java.lang.NoSuchMethodError: com.timen.demo.Person.setSuperUser(Z)错误。
该java.lang.NoSuchMethodError为setSuperUser(Z)对应的方法应该是setSuperUser(boolean var)
而在新的Person文件中的setSuperUser方法的签名为可以用javap -s Person查看:
D:\temp\com\timen\demo>javap -s Person Compiled from "Person.java" public class com.timen.demo.Person extends java.lang.Object{ public com.timen.demo.Person(); Signature: ()V public java.lang.String getName(); Signature: ()Ljava/lang/String; public void setName(java.lang.String); Signature: (Ljava/lang/String;)V public java.lang.Boolean isSuperUser(); Signature: ()Ljava/lang/Boolean; public void setSuperUser(java.lang.Boolean); Signature: (Ljava/lang/Boolean;)V } D:\temp\com\timen\demo>这里就查到原因了,Java在编译的时候确定方法的签名,而Boolean为引用类型使用Ljava/lang/Boolean;签名,而boolean为原生数据类型,用Z作为签名,所以两次编译TestNoSuchMethodError所生成的字节码并不相同。而我们在做手动增量更新的时候又竟然忘记,就会出现java.lang.NoSuchMethodError错误。
相关推荐
主要介绍了解决 java.lang.NoSuchMethodError的错误的相关资料,需要的朋友可以参考下
NULL 博文链接:https://sunrysoft.iteye.com/blog/1677989
NULL 博文链接:https://albert0707.iteye.com/blog/562969
java.lang.NoSuchMethodError异常处理要点
主要介绍了启动Azkaban报错:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap,需要的朋友可以参考下
jackson-annotations-2.10.2.jar jackson-core-2.10.2.jar jackson-databind-2.10.2.jar NoClassDefFoundError解决
1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method 'void ()' not found at org.jetbrains.idea.maven.server.embedder....
内含hibernate3.2与修复java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V 的错误的cglib2.2
java.lang.NoSuchMethodError 方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。 java.lang.OutOfMemoryError 内存不足错误。当可用内存不足以让Java虚拟机分配给一个...
1.如果运行程序出现错误:“Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory”,这是因为项目缺少slf4j-api.jar和slf4j-log4j12.jar这两个jar包导致的错误。 2.如果运行程序...
Android系统是在Linux 2.6版本上开发的,所以起使用设备驱动 /dev/input/event X (x为0到7)分别来映射不同事件。
文件内不仅内含jsp、jstl、struts1、struts2、jsf、freemarker、spring、velocity等常用标签,而且更含有JavaScript和Ajax常用函数的说明和实例。
New Developments In OpenSource Ecosystem Spark30 Koalas DeltaLake
Bluetooth LE for iOS and Android v2.3.unitypackage
pentaho kettle solutions
java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I 解决方案
Hibernate经典版 通过图解让你轻松学会Hibernate
登陆报错的问题 登录 java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I 问题 导入数据库乱码解决方案: 人才管理系统项目详细文档说明 ========================================= 系统安装...
java.lang.NoSuchMethodError: redis.clients.jedis.ScanResult.getStringCursor()Ljava/lang/String; at org.crazycake.shiro.WorkAloneRedisManager.keys(WorkAloneRedisManager.java:149) at org.crazycake....
General_NetSDKDemo_Chn_Java_Linux64_IS_V1.00.41295.T.190925.7z 这里的包是Linux64最全的,大华技术说其他的linux动态库都是有问题的 分三个包 大华设备各种Demo及所需jar包 \libs\linux64 examples.jar ...