gpt4 book ai didi

java - Java反射API中的反射方法是什么?

转载 作者:行者123 更新时间:2023-12-01 15:40:13 24 4
gpt4 key购买 nike

我们可以使用什么方法来代替 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com