2011-02-25 56 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