NoSuchMethodError多是因为类冲突,没有加载版本需要的class而加载了其他路径下的class,但是本文记录的是重载代码修改在增量发布环境下出现的异常情况!
调用者:
package util;
public class Invoker {
public static void main(String[] args) {
CommUtil c=new CommUtil();
String s="ssssssssss";
System.out.println(c.format(s));
}
}
报异常:
Exception in thread "main" java.lang.NoSuchMethodError: util.CommUtil.format(L
va/lang/String;)Ljava/lang/String;
at util.Invoker.main(Invoker.java:9)
原因是因为重载方法删除后,调用者的的代码没有重新编译。该问题出现在“增量发布”的场景,只发布了代码修改过的CommUtil.class,没有发布Invoker的class
当CommUtil.java 中有如下两个重载方法时
package util;
public class CommUtil {
public String format(String v ){
return "String format "+v;
}
public String format(Object v){
return "Object format "+v.toString();
}
}
调用类编译后class的反编译后如下:
D:\clstest\util>javap -c Invoker.class
Compiled from "Invoker.java"
public class util.Invoker {
public util.Invoker();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":
()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #16 // class util/CommUtil
3: dup
4: invokespecial #18 // Method util/CommUtil."<init>":()V
7: astore_1
8: ldc #19 // String ssssssssss
10: astore_2
11: getstatic #21 // Field java/lang/System.out:Ljava/
io/PrintStream;
14: aload_1
15: aload_2
16: invokevirtual #27 // Method util/CommUtil.format:(Ljav
a/lang/String;)Ljava/lang/String;
19: invokevirtual #31 // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
22: return
}
当删除format(String v) 这个方法后,CommUtill.java内容如下:
package util;
public class CommUtil {
public String format(Object v){
return "Object format "+v.toString();
}
}
javap -c 反编译如下:
D:\src\ssm3\target\test-classes\util>javap -c Invoker.class
Compiled from "Invoker.java"
public class util.Invoker {
public util.Invoker();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":
()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #16 // class util/CommUtil
3: dup
4: invokespecial #18 // Method util/CommUtil."<init>":()V
7: astore_1
8: ldc #19 // String ssssssssss
10: astore_2
11: getstatic #21 // Field java/lang/System.out:Ljava/
io/PrintStream;
14: aload_1
15: aload_2
16: invokevirtual #27 // Method util/CommUtil.format:(Ljav
a/lang/Object;)Ljava/lang/String;
19: invokevirtual #31 // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
22: return
}
总结:
重载是编译是的多态行为,java编译器会根据多态的方法的参数就近选择一个方法编译。如上面例子,当CommUtil 有format(String v )方法时候,Invoker 调用format时会被编译成
16: invokevirtual #27 // Method util/CommUtil.format:(Ljav
a/lang/String;)Ljava/lang/String;
但是当删除format(String v )只留下format(Object v )时,会被编译成
16: invokevirtual #27 // Method util/CommUtil.format:(Ljav
a/lang/Object;)Ljava/lang/String;
所以在生成环境的增量发布流程需要优化,需要注意重载代码修改后的相关优化或者谨慎对重载方法进行修改
相关推荐
java.lang.NoSuchMethodError异常处理要点
NULL 博文链接:https://sunrysoft.iteye.com/blog/1677989
主要介绍了解决 java.lang.NoSuchMethodError的错误的相关资料,需要的朋友可以参考下
《 从NoSuchMethodError看jvm编译和class加载方式》的测试项目代码
NULL 博文链接:https://wuhuajun.iteye.com/blog/1867596
NULL 博文链接:https://albert0707.iteye.com/blog/562969
小则影响性能,大则引起生产发布和运行时异常。 其实以上问题的根源都来自于Maven的Jar包冲突和使用不当的依赖传递。这篇文章我就好好分析下以下3个内容: 依赖传递的原则和产生Jar包冲突的原理分析 定位冲突...
1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method 'void ()' not found at org.jetbrains.idea.maven.server.embedder....
主要介绍了启动Azkaban报错:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap,需要的朋友可以参考下
java.lang.NoSuchMethodError 方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。 java.lang.OutOfMemoryError 内存不足错误。当可用内存不足以让Java虚拟机分配给一个...
NULL 博文链接:https://yangzb.iteye.com/blog/265212
Acts As Votable - 让任何ActiveRecord模型具备投票特性如:喜欢/不喜欢,赞同/反对
1. 优先按照依赖管理 [dependencyManagement] 元素中指定的版本进行仲裁 2. 若无版本声明,则按照 “短路径优先” 原则(Maven2.
针对Action class [userAction] not found - action 和java.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;)V 两类异常非常有用的解决方法
内含hibernate3.2与修复java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.(Z)V 的错误的cglib2.2
比如,多个构造方法次序、NoSuchMethodError 处 理;新增扩展说明 5 条。比如,父集合元素的增加或删除异常等。 3)修改描述 22 处。比如,魔法值的示例代码、ScheduledThreadPool 问题等。 4)修正嵩山版中部分代码...
SSH项目部署在window和linux下的Weblogic上出现 ClassNotFound异常解决办法,文档中包括在解决ClassNotFound问题的过程中出现的另外一个问题,比如java.lang.NoSuchMethodError: javax.xml.transform.dom.DOMResult....
New Developments In OpenSource Ecosystem Spark30 Koalas DeltaLake
pentaho kettle solutions