2011-11-18 97 views
0

我们可以使用什么方法来代替Java反射API?我们如何定义它?源代码示例将会很有帮助。Java反射API中反射的方法是什么?

+0

你在说什么反思api?你在用什么语言?请提供一些背景。 – Frank

+0

我正在使用java.I来谈论java中的反射api。 – anurag

+0

所以你想要反射java代码的java反射API的替代? –

回答

0

通常,当您使用Reflection API时,这是因为您需要动态访问某个类的内容,并且没有其他方法可以执行此操作。请添加更多详细信息(如果您想要更详细的答案,请添加更多详细信息:)

1

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)即时创建类。

这两种方法比标准反射要复杂得多,但可以比反射具有显着的性能提升。