如果您别无选择,您绝对必须保留所有现有类名及其确切名称(如您对我之前回答的评论中所述),那么您必须使用 AspectJ。
假设我们有这个类:
public class UnmodifyableClassWithMain {
public static void main(String[] args) {
System.out.println("In main");
new ClassUsingArgumentRegistry();
}
}
首先,您需要保存命令行参数的东西。为简单起见,我将使用一个带有静态字段的简单类:
public class ArgumentRegistry {
public static String[] ARGS;
}
然后,您需要定义一个 Aspect 来拦截对 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]