这两种方法都比标准反射复杂得多,但比反射有显著的性能改进。
我们可以使用什么方法来代替Java反射API?我们如何定义它?下面是一个源代码示例。
JDK 1.6具有动态编译Java类的能力(参见getsystemjavaccompiler)。如果您不想使用反射(出于性能考虑,我们使用动态编译),那么这是一种合理的方法。
从包含代码的字符串创建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)动态创建类。
通常当您使用反射API时,这是因为您需要动态访问类的内容,并且没有其他方法可以做到这一点。如果你想要一个更详细的答案,请添加更多的细节(你到底想要实现什么?)