我有一個包含5個類的jar文件。我只想改變那個班的一個邏輯。通過源碼包更新現有的類定義
BaseClass是我需要修復的一個。請檢查以下基本結構。 我只需要刪除一行並在changeMe
方法中添加3行。
類結構
package com.temp;
public class BaseClass{
public interface IClassA{ String sayRaw(String raw); }
private BaseClass(){}
protected static class ClassToFix extends ClassParent {
@Override public void changeMe() {
........
}
}
}
//---------Source from jar file--------------
package com.temp;
public class ClassA implements IClassA{
public static final BaseClass.IClassA ABC = ....;
String sayRaw(String raw){
}
}
我試了一下
- 該類沒有公共構造函數,所以擴展類的選項出來了。
- 我嘗試了bytebuddy的方法攔截器,發生了同樣的問題。
- 最後我嘗試了javaassist。它也不起作用,因爲它不是更新jar文件中的方法定義。
我在我的src目錄中創建了相同的包,並複製了類定義並添加了我的修補程序。此修補程序在Dynamic web項目中工作,但不在Maven Java項目中。這是說明連接錯誤
ClassA is implementation of interface (IClassA) from BaseClass which is the modified source.
java.lang.LinkageError: loader constraint violation: when resolving field "ABC" the class loader (instance of org/springframework/boot/devtools/restart/classloader/RestartClassLoader) of the referring class, com/temp/ClassA, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the field's resolved type, com/temp/BaseClass$IClassA, have different Class objects for that type
如果有任何其他方式來解決這個問題,建議我。
在你的類路徑中使用同一個類的不同版本是很麻煩的。我的建議是用任何需要的修改重新編譯所有五個類,並將它們打開,並僅使用你的jar。 –
克隆類的來源,然後將該類從運輸它的jar中提取出來,也許使用類似arquillian的東西(或者像我們通過在部署中解壓自己的jar一樣)。我不*真的*推薦這個,但是......它的工作原理 – xenoterracide
根據你如何使用這個課程以及爲什麼你需要「猴子補丁」它可能有其他選項 – xenoterracide