我想知道是否存在任何类型的库或变通方法来使用我的运行时编译类(我动态生成我的类,编写.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的情况下相互通信,同时包的主要激活是通过方法invoke()?
我试着没有运气,我有一些"错误:找不到符号",似乎运行时加载的类无法相互通信
答案 0 :(得分: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。见detailed post about it。 它只适用于Java 7,请注意我从未使用它,所以怎么不知道它是否提供比反射更好的性能。
答案 1 :(得分:1)
如果你没有使用反射api,你必须通过new运算符实例化类。这需要在编译时具有类文件。所以这是不可能的。如果您的TGoal类正在实现Interface IGoal,那么您可以将Object o转换为IGoal。这使您可以像使用任何其他对象一样使用对象,而无需使用反射API。
答案 2 :(得分:-1)
您确定必须在运行时创建代码吗?最简单的方法是避免这种情况。
如果在此程序中不必发生TGoal x = new TGoal()
,则在生成的代码中创建一个main函数并启动第二个java应用程序。