运行时代码生成和编译

Bar*_*lom 5 java code-generation javac runtime-compilation classloader

假设我有这段代码,它使用一些输入(例如 URL 路径)来通过反射来确定要运行的方法:

// init
map.put("/users/*", "viewUser");
map.put("/users", "userIndex");

// later
String methodName = map.get(path);
Method m = Handler.class.getMethod(methodName, ...);
m.invoke(handler, ...);
Run Code Online (Sandbox Code Playgroud)

这使用反射,因此可以提高性能。可以这样做:

// init
map.put("/users/*", new Runnable() { public void run() { handler.viewUser(); } });
map.put("/users", new Runnable() { public void run() { handler.userIndex(); } });

// later
Runnable action = map.get(path);
action.run();
Run Code Online (Sandbox Code Playgroud)

但手动创建所有这些Runnable都有其自身的问题。我想知道,我可以在运行时生成它们吗?因此,我将拥有第一个示例中的输入映射,并动态创建第二个示例的映射。当然,生成它只是构建一个字符串的问题,但是编译和加载它呢?

注意:我知道性能提升很小,这是过早优化的完美例子。因此,这是一个学术问题,我对运行时生成和代码编译感兴趣。

Yis*_*hai 4

动态生成代码的唯一方法是生成源代码并编译它,或者生成字节代码并在运行时加载它。前者有模板解决方案,后者有字节码操作库。如果没有真实的案例和一些分析,我认为你无法真正说出哪个会更好。从维护的角度来看,我认为反射是可用的最佳选择。