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



我们可以使用什么方法来代替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时,这是因为您需要动态访问类的内容,并且没有其他方法可以做到这一点。如果你想要一个更详细的答案,请添加更多的细节(你到底想要实现什么?)

相关内容

  • 没有找到相关文章

最新更新