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

标签 java reflection

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

相关文章:

Java 开发环境 : Eclipse and NetBeans annoyances : any possible fixes or alternatives?

java - 使用 Jenkinsfile 和 maven 对 pullRequest 的代码启动声纳分析

java - 垃圾收集器并清空 onDestroy 中的引用

java - 使用泛型时是否需要使用 'instanceOf'?

swift - 如果值为 `rawValue`,如何从 `Any` 中提取 `RawRepresentable`

c# - 在 C# 和反射中从接口(interface)类型转换为具体类型

c# - 从资源加载的程序集引发无法加载文件或程序集

java - 我如何使用集成测试运行器在我的 IntelliJ IDEA 项目中运行除以 "IntegrationTest"结尾的那些之外的所有 JUnit 单元测试?

java - 在代码库中查找 Java Reflection 的用法

Java 通用转换错误