1

我想知道是否存在任何类型的库或解决方法来使用我的运行时编译的类(我动态生成我的类,编写 .java,然后在 .class 中编译它们,所有这些都发生在运行时)而不使用反射库?

使用反射加载我总是必须像这样工作:

//path where my newly generated classes are 
File file = new File("e:\\tmp");
// Convert File to a URL
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("eu.dataaccess.footballpool.TGoal");
// Create an instance of the class just loaded
Object o = cls.newInstance();
Method method2 = cls.getDeclaredMethod("getIMinute");
Object result2 = method2.invoke(o);

我的问题是是否可以在运行时使用

TGoal x = new TGoal();

x.getIMinute();

编辑:似乎不可能按照我希望的方式行事。我修改了我的问题:是否可以在运行时加载整个包,以使加载的包的类能够在没有 method.invoke 的情况下相互通信,同时包的主要激活是通过方法调用()?

我试过没有任何运气,我有一些“错误:找不到符号”,运行时加载的类似乎无法相互通信

4

3 回答 3

1

你可以做

x.getIMinute();

通过使用接口,但是 AFAIK 你不能在没有反射的情况下创建新的类实例。

相反,要调用动态创建的对象的方法,您可以声明一个接口:

public interface MinuteGetter{
   public int getIMinute();
}

您的动态对象必须实现他的,而不是您可以做的:

Class cls = cl.loadClass("eu.dataaccess.footballpool.TGoal");
// Create an instance of the class just loaded
MinuteGetter o = (MinuteGetter) cls.newInstance();
o.getIMinute();

如果您无法将接口应用到您的代码中,您可以尝试使用 AnonymousClassLoader。请参阅有关它的详细帖子。它仅适用于 Java 7,请注意我从未使用过它,所以不知道它是否提供比反射更好的性能。

于 2012-07-02T10:43:15.830 回答
1

如果您不使用反射 api,则必须通过 new 运算符实例化类。这需要在编译时拥有类文件。所以这是不可能的。如果您的类 TGoal 正在实现一个接口 IGoal,那么您可以将您的 Object o 转换为 IGoal。这使您可以像使用任何其他对象一样使用您的对象,而无需使用反射 api。

于 2012-07-02T10:47:04.950 回答
-1

您确定必须在运行时创建代码吗?最简单的方法是避免这种情况。

如果TGoal x = new TGoal()在这个程序中不需要发生,那么在生成的代码中创建一个 main 函数并启动第二个 java 应用程序。

于 2012-07-02T10:42:31.623 回答