java.lang.NoSuchMethodError,想必 Java的开发者都遇到过这个报错吧,这个错误基本上都是由JVM 的 “全网负责委托机制”,(全网负责委托机制是啥? --- 》》 https://cloud.tencent.com/developer/article/1353281)
引发的问题, 本人在此奉上三种解决方案:
步骤一:全局搜索该方法是否存在,(目前IDEA可以支持该操作,包括source包均能搜到)如果搜不到那就是真的不存在,一般人不会犯这个错(除非你不是一般人),如果存在这个方法,看步骤二
步骤二:如果是自己项目中自定义的方法,那么执行 clean install 就o的k了,如果这个方法是来自公司的私服或者开源的jar包里面的方法,那么这个时候除了项目clean install外,最好就是去本地仓库里面把已经下载jar包全部删除,重新download一遍,基本可以解决问题,如果以上方法还行不通,看步骤三(终极方案)
步骤三:上述两种方案都没用,极有可能就是某个jar有冲突,引入了多个版本的类包,这个问题的排查是比较棘手的,特别是在web应用的情况下。类路径的系统目录比较多,情况尤其复杂,你很难知道JVM到底从哪里类包中加载类文件,针对这个问题,送你一个jsp用来处理这个情况,将 addSrc.jsp 放到Web应用的根路径下,通过如下方式即可查看JVM从哪个类包中加载的指定类,从而就能排除有冲突的jar包了,亲测有效哦:
http://localhost:8081/addSrc.jsp?className=com.wy.reflect.reflectTest (com.wy.reflect.reflectTest 就是找不到那个方法的类)
addSrc.jsp 代码如下:
<%@page contentType="text/html; charset=GBK"%> <%@page import="java.security.*,java.net.*,java.io.*"%> <%! public static URL getClassLocation(final Class cls) { if (cls == null)throw new IllegalArgumentException("null input: cls"); URL result = null; final String clsAsResource = cls.getName().replace('.', '/').concat(".class"); final ProtectionDomain pd = cls.getProtectionDomain(); // java.lang.Class contract does not specify if 'pd' can ever be null; // it is not the case for Sun's implementations, but guard against null // just in case: if (pd != null) { final CodeSource cs = pd.getCodeSource(); // 'cs' can be null depending on the classloader behavior: if (cs != null) result = cs.getLocation(); if (result != null) { // Convert a code source location into a full class file location // for some common cases: if ("file".equals(result.getProtocol())) { try { if (result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip")) result = new URL("jar:".concat(result.toExternalForm()) .concat("!/").concat(clsAsResource)); else if (new File(result.getFile()).isDirectory()) result = new URL(result, clsAsResource); } catch (MalformedURLException ignore) {} } } } if (result == null) { // Try to find 'cls' definition as a resource; this is not // document.d to be legal, but Sun's implementations seem to //allow this: final ClassLoader clsLoader = cls.getClassLoader(); result = clsLoader != null ? clsLoader.getResource(clsAsResource) : ClassLoader.getSystemResource(clsAsResource); } return result; } %> <html> <head> <title>srcAdd.jar</title> </head> <body bgcolor="#ffffff"> 使用方法,className参数为类的全名,不需要.class后缀,如 srcAdd.jsp?className=java.net.URL<br><br><br> <% try { String classLocation = null; String error = null; String className = request.getParameter("className"); classLocation = ""+getClassLocation(Class.forName(className)); if (error == null) { out.print("类" + className + "实例的物理文件位于:"); out.print("<hr>"); out.print(classLocation); } else { out.print("类" + className + "没有对应的物理文件。<br>"); out.print("错误:" + error); } }catch(Exception e) { out.print("异常。"+e.getMessage()); } %> </body> </html>
目录截图:
效果图:
————————————————
版权声明:本文为CSDN博主「麻辣你个王子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28675967/article/details/90579636