一、問題及原因
程序里有個工具類,MQMessageSender.send(),這是個static方法,平時一般調用該方法來發送mq。
調用場景如下:
結果這兩天報了個錯:
java.lang.NoClassDefFoundError: Could not initialize class com.ceiec.rabbitmqservice.utils.MQMessageSender
錯誤的原因,看起來說的是,class definition沒找到:不能初始化這個類。
后來大概看了下,這個類的class文件是存在的。
后邊想了半天,沒找到具體原因,然后看看有人是不是最近改了這個類,翻了下svn記錄,發現新增了一個static變量,這個變量的初始化會失敗。
如下,這里這個innerMsgTemplate變量,需要查找spring容器的bean,但是這個bean,忘配置了,所以根本找不到這個bean。
所以,這個問題原因就是static變量的初始化失敗導致。
所以,大家應該看出來,編譯,是不會有問題的;這個問題,只會在運行時,去加載這個類的時候,才發現。加載類的時候,就要去執行它的static塊、給static變量初始化等,
這時候如果報錯,就會出現這個 java.lang.NoClassDefFoundError。
ps,說到運行時加載,我想到了aop里面,除了我們常用的那種運行時織入(spring aop),還有另外兩種方式,一種是編譯器織入,即
編譯好的class已經是織入了切面后的class,再一種就是ltw(load time weaving),也叫類加載期織入。
這種織入就是在類首次被加載的時候,對該類的class字節碼進行切面織入,從而實現aop功能。
這個ltw,可以參考:
https://blog.csdn.net/deniro_li/article/details/82018648