選択肢がない場合は、既存のクラス名をすべて正確な名前で保持する必要があります(私の前の回答へのコメントで述べたように)、AspectJを使用する必要があります。
このクラスがあると考えてみましょう。
public class UnmodifyableClassWithMain {
public static void main(String[] args) {
System.out.println("In main");
new ClassUsingArgumentRegistry();
}
}
まず、コマンドライン引数を保持するものが必要です。簡単にするために、静的フィールドを持つ単純なクラスを使用します。
public class ArgumentRegistry {
public static String[] ARGS;
}
次に、mainへの呼び出しをインターセプトし、引数を格納するアスペクトを定義する必要があります。
public aspect StoreArgumentsOfMain {
/**
* This pointcut intercepts all calls to methods called main with a string array as
* argument.
*/
pointcut mainMethod(String[] arguments): execution(void main(String[])) && args(arguments);
/**
* Before the original main method gets called, store the arguments in the registry.
*/
before(String[] arguments): mainMethod(arguments) {
System.out.println("Storing arguments");
ArgumentRegistry.ARGS = arguments;
}
}
それを試すために、ClassUsingArgumentRegistryも作成しました。
public class ClassUsingArgumentRegistry {
public ClassUsingArgumentRegistry() {
System.out.println("Arguments: " + java.util.Arrays.toString(ArgumentRegistry.ARGS));
}
}
それでおしまい。AspectJのコンパイル時ウィービングを有効にし、「java UnmodifyableClassWithMain Foo Bar Baz」を使用して結果を実行すると、次の出力が得られます。
Storing arguments
In main
Arguments: [foo, bar, baz]