2012-06-04 52 views
1

負載類我知道這可能已經是與類加載器,但我無法找到一個例子(它可能是我在谷歌,荷蘭國際集團的錯誤的關鍵詞的Java:從字符串

我試圖加載一個類(或方法)形成一個字符串,長度不包含類的名稱,而是一類的代碼,例如

class MyClass implements IMath { 
    public int add(int x, int y) { 
     return x + y; 
    } 
} 

,然後做這樣的事情:

String s = "class MyClass implements IMath { public int add(int x, int y) { return x + y; }}"; 
IMath loadedClass = someThing.loadAndInitialize(string); 
int result = loadedClass.add(5,6); 

現在很明顯,someThing.loadAndInitialize(string) - 部分是我不知道如何實現的。這甚至有可能嗎?或者,運行JavaScript並以某種方式「給」變量/對象(如x和y)會更容易嗎?

謝謝你的任何提示。

+0

http://stackoverflow.com/questions/1168931/how-to-create-an-object-from-a-string-in-java-how-to -eval-a-string – nullpotent

+0

就個人而言,如果源代碼*有*爲Java,那麼我要麼使用Java編譯API,要麼只是使用Java編程API,或者Janino,javassist等。 –

回答

7

使用Java編譯器API。 Here是一篇博客文章,向您展示如何做到這一點。

您可以爲此使用臨時文件,因爲這需要輸入/輸出文件,或者您可以創建JavaFileObject的自定義實現,該實現從字符串讀取源。從javadoc

/** 
    * A file object used to represent source coming from a string. 
    */ 
    public class JavaSourceFromString extends SimpleJavaFileObject { 
     /** 
     * The source code of this "file". 
     */ 
     final String code; 

     /** 
     * Constructs a new JavaSourceFromString. 
     * @param name the name of the compilation unit represented by this file object 
     * @param code the source code for the compilation unit represented by this file object 
     */ 
     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; 
     } 
    } 

一旦你的輸出文件(這是一個編譯.class文件),則可以使用URLClassLoader如下加載:

ClassLoader loader = new URLClassLoader(new URL[] {myClassFile.toURL()); 
    Class myClass = loader.loadClass("my.package.MyClass"); 

,然後實例化,使用:

myClass.newInstance(); 

或使用Constructor

+0

謝謝,我沒有不知道編譯器api :-) –

2

可以在JDK 7中使用Rhino和JavaScript。這可能是一個很好的方法。

invokedynamic來了....

如果你想堅持使用Java,你需要的東西來分析源代碼,並把它變成字節碼 - 類似CGLIB。

0

您可以使用JavaCompiler進行編譯,但我建議您使用Groovy來創建此運行時類。這會容易得多。