5つのクラスを含むjarファイルがあります。私はそのクラスの一つのロジックを変更したいだけです。ソースパッケージ別に既存のクラス定義を更新する
BaseClassは私が修正する必要があるものです。以下の基本構造をご確認ください。 changeMe
メソッドでは、1行を削除して3行追加するだけです。
私はクラスがそのクラスのオプションを拡張し、publicコンストラクタを持っていない
- しようとしたどのようなクラス構造が
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ディレクトリに同じパッケージを作成し、クラス定義をコピーして修正を加えました。この修正は動的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
これを修正する方法が他にもある場合は、私に教えてください。
クラスパスに同じクラスの異なるバージョンを持つことは、おそらく面倒です。私の推奨は、必要な変更を加えて5つのクラスをすべて再コンパイルし、それらをjarして、あなたのjarだけを使うことです。 –
クラスのソースをクローンし、クラスをArilillianのようなものを使用して(または、私たち自身を展開で自分自身を解凍しているように)、それを配送するjarファイルから取り出します。私は*本当にこれをお勧めしませんが...それは動作します – xenoterracide
あなたがこのクラスをどのように使用しているのか、そしてなぜあなたが "モンキーパッチ"それを必要とするかに応じて他のオプションがあるかもしれません – xenoterracide