2011-02-25 53 views
0

如果可能,我將如何在我加載的類的Main類中調用一個函數? (我知道這是不可能的理解,所以我會解釋)來自加載類的Java調用類函數

即:

public class SomeClass 
{ 
    public SomeClass 
    { 
      //load a class here 
    } 

    public void FuncToCall() {} 
} 

//In a separate file, dynamically loaded. 
public class LoadedClass 
{ 
    public LoadedClass 
    { 
      //Call a function in the class that loads this 
      SomeClass.FuncToCall(); 
    } 
} 

因此,我將結束有2個文件:SomeClass.class和LoadedClass.class。我想我的主要問題是,我如何引用LoadedClass中的SomeClass?

**編輯:

所以也許我應該更好地解釋使用情況。一個Java程序動態加載文件夾中的「SomeClass」腳本。然後該腳本從互聯網上下載一個.jar文件,並在其中打開並運行「LoadedClass」腳本。如果SomeClass不在相同的.jar或.jar中,我如何在LoadedClass中的SomeClass中使用函數?

+0

歡迎來到Stack Overflow!我不認爲我完全理解你的問題。你能詳細說明你試圖去做什麼,以及你目前的方法爲什麼不起作用? – templatetypedef 2011-02-25 03:23:50

+0

那麼,我還沒有試着編譯它呢。我想我應該試試。也許我有Compilation Errorphobia。 XP – LordZardeck 2011-02-25 03:32:14

回答

0

你就去做吧..

如果他們在不同的包,你必須要麼導入類或使用完全合格的名稱。

讓我看看我是否得到它。

檢查這個運行樣品與修改源代碼:

C:\Users\oreyes\java>type SomeClass.java LoadedClass.java Main.java 
//SomeClass.java 
public class SomeClass{ 
    public SomeClass() /* added() */ { 
      //load a class here 
      LoadedClass lc = new LoadedClass(this); 
    } 
    public void funcToCall() { 
     System.out.println("SomeClass.functToCall: Being invoked :)"); 
    } 
} 
//LoadedClass.java 
//In a separate file, dynamically loaded. 
public class LoadedClass { 
    public LoadedClass(SomeClass sc)/*added() */ { 
      //Call a function in the class that loads this 
      //SomeClass.funcToCall(); 
      sc.funcToCall(); 
    } 
} 
//Main.java 
// 
public class Main { 
    public static void main(String ... args) { 
     new SomeClass(); 
    } 
} 
C:\Users\oreyes\java>javac SomeClass.java LoadedClass.java Main.java 
C:\Users\oreyes\java>java Main 
SomeClass.functToCall: Being invoked :) 
C:\Users\oreyes\java> 

所做的是什麼,以裝載機類的引用傳遞到負載,並從那裏...只是調用的方法。

我希望這會有所幫助。

編輯

根據您的評論,它看起來像你需要的是使用Reflection

+0

那麼,任何包都不是。我正在爲一個程序編寫腳本,只需要你實現他們的界面。我想編寫一個加載不同腳本的加載器。因此,Loader或腳本都不在任何包中。那麼我將如何參考它們?或者我必須參考他們? – LordZardeck 2011-02-25 03:31:13

+0

如何使用Class.newInstance()傳遞參數? – LordZardeck 2011-02-25 03:38:10

+0

哦,我明白了。你不能用'class.forName()'加載這個類,並且從返回的類objetct中得到一個接收類型爲http://download.oracle的構造函數。com/javase/6/docs/api/java/lang/Class.html#getConstructor(java.lang.Class ...),然後使用'Constructor.newInstance'方法創建它:http://download.oracle.com /javase/6/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang.Object ...)您要查找的內容稱爲:「Reflection」 – OscarRyz 2011-02-25 04:03:02

0

你現在就做。

我們稱之爲 - >遞歸性(如果你調用從調用該函數的功能相同) 或者乾脆..重定向..你要學會一點一點什麼是編程的潛力:d

歡迎來到StackOverflow:D 祝你好運!

+0

我試過編譯。它不知道我是從哪個班級打電話來的。 – LordZardeck 2011-02-25 03:40:17

+0

因爲如果你從另一個類調用一個類,你需要在之前創建一個對象。 (OOP)查看大回答 示例: 'Class X {public functionX(){}} Y類{public functionY(){ X object = new X(); //創建一個對象來訪問函數X object.functionX(); //你稱爲類X的函數 } }' – ThorDozer 2011-02-25 03:42:36

0

因爲如果您從另一個類調用某個類,則需要先創建一個對象。 (OOP) 示例:

Class X{ public functionX(){}} 
Class Y { 
    X object = new X(); //Create an object to access to the function X 
    public functionY(){ 
      object.functionX(); //you call the function from Class X 
    } 
} 
+0

問題依然存在於X和Y都不在包中,而且它們在單獨的文件中。你在那種情況下如何引用他們? – LordZardeck 2011-02-25 04:01:24

+0

即使它們是單獨的文件..如果它們在同一個「Project」中,您可以調用它。但是,在外面創建你的對象。我更新我的答案 – ThorDozer 2011-02-25 04:04:43