1.java.lang.ClassNotFoundException
2.Java问题解决录: 运行时抛出NoSuchMethodError / NoSuchFieldError异常
3.015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别
4.JVMä¹classå è½½è¿ç¨
java.lang.ClassNotFoundException
å¨javaå½ä¸ï¼æ§è¡çææçç±»é½æ¯ClassLoaderå è½½çï¼æ以å¦æ说没æ¾å°ç±»ï¼å°±åºè¯¥æ³å°æ¯ä¸æ¯ClassLoader没æå¨æå®çä½ç½®loadå°åºè¯¥æçç±»å¢ï¼ç±äºClassLoadçç¹æçæ 形继æ¿ç»æï¼ä½¿å¾è¶åºå±çClassLoadæ¯ä¸å±çè½å¤å è½½æ´å¤çç±»ãæ以ï¼åç°è¿ç§é®é¢ï¼é¦å ççæ¯ä¸æ¯classPath设置é误ï¼æè è·è¸ªä¸ä¸ClassLoadderççæ¯ä¸æ¯ççå¨çº¿ç¨æ§è¡çå½åçClassLoaderå½ä¸æ²¡æå è½½å°è¯¥class.
Java问题解决录: 运行时抛出NoSuchMethodError / NoSuchFieldError异常
现象描述
在IDE中编译运行程序无异常,但在打包成可运行的jar包(如Spring Boot jar包)后,程序运行时会抛出NoSuchMethodError或NoSuchFieldError异常。
问题定位步骤
通过增加JVM参数如-verbose:class、-XX:+TraceClassLoading或-Xlog:class+load=debug来查看类的加载情况。使用Arthas工具的源码分享网源码jad命令可以查看已加载类的源码,从而查看类的加载路径、jar包版本号及使用的类加载器。
问题分类
问题可能源自三个主要方面:
1. **重复类定义**:在同包中或不同jar包中定义了同名类,导致类加载器加载了错误的类。这类问题通常发生在第三方jar包与项目自身的jar包中。
2. **依赖版本冲突**:maven的传递依赖特性可能导致多个版本的类被加载,最终生效的北京知识课堂源码版本可能导致NoSuchMethodError或NoSuchFieldError异常。根据maven的广度优先遍历算法,高版本或低版本的类可能覆盖了其他版本的类。
3. **反射机制错误**:使用反射时,如果类定义错误或传递参数错误,也可能导致运行时异常。目前尚无自动检测这类错误的安卓指标源码工具。
编译期发现方法
对于使用maven的项目,可以配置额外的enforcer-rules(如Ban Duplicate Classes规则)来在编译期间强制发现重复类定义的问题。对于使用Android Studio(Gradle工具)的项目,这类编译错误提示较为常见。
总结
通过增加JVM参数、使用Arthas工具、交友小纸条源码分析maven依赖树和代码中的反射使用情况,可以有效地定位和解决NoSuchMethodError或NoSuchFieldError异常。确保类定义的唯一性、避免依赖版本冲突以及正确使用反射机制是预防此类异常的关键。
反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别
Class.forName()与ClassLoader.loadClass()都是Java反射机制中的类加载方法。它们在实现类的西藏源码资本股权加载与使用时有细微区别。
类加载过程在Java中分为三个步骤:加载、链接和初始化。链接过程又包括验证、准备和解析。各个步骤按顺序执行,其中解析步骤除外。
Class.forName()方法实际调用的是Class.forName(className,true,classloader)。这里的关键在于第二个布尔参数。当此参数设置为true时,表示在加载类后必须执行初始化操作。因此,在调用此方法后,目标对象的静态块代码已被执行,静态变量也已初始化。
相比之下,ClassLoader.loadClass()方法则调用的是ClassLoader.loadClass(className,false)。此处的布尔参数不同,它表示在加载类后不进行链接。这意味着该类的静态块中的内容不会被执行。由此可见,Class.forName()与ClassLoader.loadClass()的主要区别在于是否执行类的初始化以及静态块内容的执行。
简而言之,Class.forName()在加载类后会执行初始化操作并运行静态块,而ClassLoader.loadClass()则在加载类后不进行链接,因此不会执行静态块内容。这使得它们在具体应用中展现出不同的功能和用途。
JVMä¹classå è½½è¿ç¨
javaèææºææè¿°ç±»çæ°æ®ä»classæ件å è½½å°å åï¼å¹¶å¯¹æ°æ®è¿è¡ æ ¡éª/åå¤/解æååå§åï¼æç»å½¢æå¯ä»¥è¢«èææºç´æ¥ä½¿ç¨çJavaç±»åï¼è¿ä¸ªè¿ç¨è¢«ç§°ä½èææºçç±»å è½½æºå¶ã称ä½èææºçç±»å è½½æºå¶ã
loading -> linking (verification -> preparation -> resolution)-> resolution)->initializing
loading: æclassæ件loadå°å åä¸ï¼éç¨å亲å§æ´¾ï¼ä¸»è¦æ¯ä¸ºäºå®å ¨æ§
verification: æ ¡éªclassæ件æ¯å¦ç¬¦åæ å
preparation: éæåéåé å å并设åå§å¼çé¶æ®µ(ä¸å æ¬å®ä¾åé)
resolution:æ符å·å¼ç¨è½¬æ¢ä¸ºç´æ¥å¼ç¨
initializing:éæåéèµåå§å¼
ç±»å è½½çè¿ç¨ä¸»è¦å为ä¸ä¸ªé¨åï¼å è½½ãè¿æ¥ãåå§åè¿ä¸ä¸ªé¶æ®µã
ç±»çå è½½æçæ¯å°ç±»ç.classæ件ä¸çäºè¿å¶æ°æ®è¯»å ¥å°å åä¸ï¼å°å ¶æ¾å¨è¿è¡æ¶æ°æ®åºçæ¹æ³åºå ï¼ç¶åå¨å åºå建ä¸ä¸ªè¿ä¸ªç±»çjava.lang.Class对象ï¼ç¨æ¥å°è£ ç±»å¨æ¹æ³åºç±»ç对象ã主è¦æ¥éª¤å¯ä»¥å为ä¸é¢çä¸ä»¶äºæ ï¼
å è½½é¶æ®µå®æåï¼èææºå¤é¨ç äºè¿å¶åèæµå°±æç §èææºæéçæ ¼å¼åå¨å¨æ¹æ³åºä¹ä¸ï¼èä¸å¨Javaå ä¸ä¹å建ä¸ä¸ªjava.lang.Classç±»ç对象ï¼è¿æ ·ä¾¿å¯ä»¥éè¿è¯¥å¯¹è±¡è®¿é®æ¹æ³åºä¸çè¿äºæ°æ®ã
ç±»çå è½½çæç»äº§åæ¯ä½äºå åºä¸çClass对象ãClass对象å°è£ äºç±»å¨æ¹æ³åºå çæ°æ®ç»æï¼å¹¶ä¸åJavaç¨åºåæä¾äºè®¿é®æ¹æ³åºå çæ°æ®ç»æçæ¥å£ãå 载类çæ¹å¼æ以ä¸å ç§ï¼
2.å è½½å¨
JVMçç±»å è½½æ¯éè¿ClassLoaderåå ¶åç±»æ¥å®æçï¼ç±»çå±æ¬¡å ³ç³»åå 载顺åºå¯ä»¥ç±ä¸å¾æ¥æè¿°ï¼
1.BootstrapClassLoaderï¼å¯å¨ç±»å è½½å¨ï¼
å¨è¿æ¥éé¢åå¯ä»¥è¢«åæ3个å°é¶æ®µï¼åå«æ¯ï¼éªè¯ï¼åå¤ï¼è§£æ
1.éªè¯ï¼ç®çï¼ï¼
2.éªè¯å 容:
éªè¯æ¯è¿æ¥é¶æ®µç第ä¸æ¥ï¼è¿ä¸é¶æ®µçç®çæ¯ä¸ºäºç¡®ä¿Classæ件çåèæµä¸å å«çä¿¡æ¯ç¬¦åå½åèææºçè¦æ±ï¼å¹¶ä¸ä¸ä¼å±å®³èææºèªèº«çå®å ¨ãéªè¯é¶æ®µå¤§è´ä¼å®æ4个é¶æ®µçæ£éªå¨ä½ï¼
éªè¯é¶æ®µæ¯é常éè¦çï¼ä½ä¸æ¯å¿ é¡»çï¼å®å¯¹ç¨åºè¿è¡æ没æå½±åï¼å¦ææå¼ç¨çç±»ç»è¿åå¤éªè¯ï¼é£ä¹å¯ä»¥èèéç¨-Xverifynoneåæ°æ¥å ³é大é¨åçç±»éªè¯æªæ½ï¼ä»¥ç¼©çèææºç±»å è½½çæ¶é´ã
3.åå¤ï¼
å¨åå¤é¶æ®µï¼ä¸ºéæåéçåå¼ä¸ºjvmé»è®¤çåå¼ï¼èä¸æ¯æ们å¨ç¨åºä¸è®¾å®çåå¼ãjvmé»è®¤ä¸ºéæåéçåå¼æ¯è¿æ ·ç
4.解æï¼
è¿ä¸é¶æ®µçä»»å¡å°±æ¯æ常éæ± ä¸ç符å·å¼ç¨è½¬æ¢ä¸ºç´æ¥å¼ç¨ ä»ä¹æ¯ç¬¦å·å¼ç¨ï¼ä»ä¹æ¯ç´æ¥å¼ç¨ã
1.å·¥ä½å 容ï¼
JVMè´è´£ä¸»è¦å¯¹ç±»åé(ç±»åéå°±æ¯staticä¿®æ¹çåé)è¿è¡åå§åè¿é主è¦å¯¹ç±»åé(ç±»åéå°±æ¯staticä¿®æ¹çåé)è¿è¡åå§åï¼åå§å主è¦æ两个æ¹å¼ï¼
2.åå§åæ¶æºï¼
ç±»åå§åæ¶æºï¼åªæå½å¯¹ç±»ç主å¨ä½¿ç¨çæ¶åæä¼å¯¼è´ç±»çåå§åï¼ç±»ç主å¨ä½¿ç¨å æ¬ä»¥ä¸å ç§ï¼
3.åå§å顺åºï¼
å¦ææç¶ç±»ï¼å顺åºæ¯ï¼ç¶ç±»staticæ¹æ³/staticåéèµå¼ â> åç±»staticæ¹æ³/staticåéèµå¼
ä¸ãç»è¯ï¼
ä¸é¢ä»ç»çå°±æ¯ç±»ï¼classï¼çå è½½ï¼å å«å®çå è½½ãé¾æ¥ãåå§åã
Androidè¿é¶ç¥è¯ç¹ï¼ææè¿æ´çäºè®¸å¤ï¼éé¢è®²è§£çé常详ç»ãå
/doc/DUkNRVFFzTGVHNiAndroid ææ¯è¿é¶æå丶é¢è¯é¢çº²ä¸¶æ ¸å¿ç¬è®°èµæã