我们可以使用什么方法来代替 Java 反射 API?我们如何定义它?源代码示例会很有帮助。
最佳答案
JDK 1.6 能够动态编译 Java 类(请参阅 getSystemJavaCompiler)。如果您不想使用反射(出于性能原因,我们使用动态编译),那么这是一个合理的方法。
从包含代码的字符串创建 Java 源文件:
public class JavaSourceFromString extends SimpleJavaFileObject {
final String code;
JavaSourceFromString(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
static final String sourceCode = ""
+ "import org.example.MySomethingObject;"
+ "public class GetSomethingDynamically implements DynamicStringGetter {\n" // DynamicStringGetter would define getString as a standard way to get a String from an object
+ " public String getString(Object o) {\n"
+ " MySomethingObject obj = (MySomethingObject) o;\n"
+ " return o.getSomething();\n"
+ " }\n"
+ "}\n";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
List<JavaFileObject> jFiles = new ArrayList<JavaFileObject>();
jFiles.add(new JavaSourceFromString("org.example.DynamicClass", sourceCode));
compiler.getTask(null, fileManager, null, null, null, jFiles).call();
然后动态加载新创建的类文件。
或者,使用字节码操作(例如 ASM )动态创建类。
这两种方法都比标准反射复杂得多,但与反射相比可以显着提高性能。
关于java - Java反射API中的反射方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8178147/