我是新的论坛,也是Java编码方面的新作。使用javax.tools进行编译并且运行时没有反射
无论如何,我正在实现我的Java代码来动态编译和运行不同的类,这些类不是先验知道的,哪些可以随时间变化(不是太频繁)。 我发现基于javax.tools的示例here非常有用,但是由于我的工作应该在以后实时运行,所以我想尽可能避免使用Java反射。 你知道是否存在一种方法来运行编译后的代码而不使用reflation?有一些变量可以在编译后找到指向类的变量,然后用它来实例化类。
谢谢你是进步 卢卡
我是新的论坛,也是Java编码方面的新作。使用javax.tools进行编译并且运行时没有反射
无论如何,我正在实现我的Java代码来动态编译和运行不同的类,这些类不是先验知道的,哪些可以随时间变化(不是太频繁)。 我发现基于javax.tools的示例here非常有用,但是由于我的工作应该在以后实时运行,所以我想尽可能避免使用Java反射。 你知道是否存在一种方法来运行编译后的代码而不使用reflation?有一些变量可以在编译后找到指向类的变量,然后用它来实例化类。
谢谢你是进步 卢卡
嘿,这么看我不知道这是否是正确的或者这是你想要什么,但我会分裂的框架,因为这样...
接口接口只是更容易理解。
public interface fun {
void fun();
}
所以让我们说某人建立的代码为您的应用程序或框架... 给他你的界面,并告诉他,把功能,但其方法..这会是这样的..
public class TestDestination implements test.fun {
public void fun(){
System.out.println("Hello");
}
}
那么所有你需要做的就是加载这个类......你可以从用户输入的XML等等等等名字......这将是你的执行者
public class TestLoad {
public static void main(String[] args) {
try {
Class t1 = Class.forName("test.temp.TestDestination");
fun temp = (fun) t1.newInstance();
temp.fun();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我不河畔e如果这正是你想要的......但它将是理想的保持加载器在一个单独的线程,并加载所有你想在程序的开始或懒惰加载它的类......你的选择 希望这可以帮助 我假设class.forName是有效的...纠正我,如果错了
好,所以打电话给t1.newInstance可以看看[示例](http://stackoverflow.com/questions/435553/java - 反射性能)所以它可以使用这种方法......但你可能想按照需求调整它......但反射并不可怕,以至于在效率方面,如果你这样做的话。 – DarthCoder
我花了一段时间才明白它,但这基本上是我在寻找的东西,非常感谢! 我想问你最后两个问题: 如果我动态编译TestDestination类,它会工作吗? 还有一些方法可以通过名称调用方法,而不会增加太多的计算工作量?请参阅 – user2497897
,该延迟的问题是将相关的类加载到内存中。这无法避免,无论你需要了解的是......当你说'java
Java反射是非常强大的...图书馆和框架利用它可以给予的能力,它不是那么慢或不正确,如果使用正确。提供替代品?我不知道...这取决于你想要如何动态的代码和其他要求和限制 – DarthCoder
基本上这个程序应该用来获取和处理来自一般用途的传感器的数据。编辑不应该太频繁,但处理和获取可能会有很高的频率。但我不是专家,我只是在[site](http://docs.oracle.com/javase/tutorial/reflect/)上播下可能的问题,所以我不知道它的限制。 – user2497897
嗯真的......但你为什么要用反射来从传感器获取信息?只是单独预先配对它们,只是将它们加载到您的项目中,如果您想动态执行它们 – DarthCoder