使用javax.tools&;不假思索地奔跑

使用javax.tools&;不假思索地奔跑,java,reflection,dynamic-compilation,Java,Reflection,Dynamic Compilation,我是这个论坛的新手,对Java编码非常陌生 无论如何,我正在实现我的Java代码来动态编译和运行不同的类,这些类是未知的,并且可能会随着时间的推移而改变(不会太频繁)。 我发现基于javax.tools提出的示例非常有用,但是,由于我的工作稍后将实时运行,因此我希望尽可能避免使用Java反射。 你知道有没有一种方法可以运行编译后的代码而不使用reflation?在编译之后,我可以检索一些变量,这些变量指向类,然后使用它来实例化类 谢谢是预付款 Luca嘿,听着,我不知道这是否正确,或者这是你想要

我是这个论坛的新手,对Java编码非常陌生

无论如何,我正在实现我的Java代码来动态编译和运行不同的类,这些类是未知的,并且可能会随着时间的推移而改变(不会太频繁)。 我发现基于javax.tools提出的示例非常有用,但是,由于我的工作稍后将实时运行,因此我希望尽可能避免使用Java反射。 你知道有没有一种方法可以运行编译后的代码而不使用reflation?在编译之后,我可以检索一些变量,这些变量指向类,然后使用它来实例化类

谢谢是预付款
Luca

嘿,听着,我不知道这是否正确,或者这是你想要的,但我会将框架分成这样的部分

接口只是为了便于理解

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();
    }
}
}
我不确定这是否正是你想要的。。。但是最好将加载程序保持在一个单独的线程上,并在程序开始时加载您想要的所有类,或者延迟加载它。。。你的选择 希望这有帮助
我假设class.forName是有效的。。。如果错误请纠正我

Java反射功能非常强大。。。库和框架利用它所能提供的能力,如果正确使用,它不会太慢或不可靠。提供替代方案??我不知道。。。这取决于您希望代码的动态程度以及其他要求和限制。一般情况下,该程序应用于从传感器获取和处理数据。编译不应该太频繁,但处理和获取的频率可能会很高。但是我不是通货膨胀的专家,我只是把可能的问题放在问题上,所以我不知道它的局限性。。。但是,为什么要使用反射来从传感器获取信息呢??只需将它们单独组合就可以了只要将它们加载到您的项目中就可以了如果您想动态执行它们我没有告诉您,以避免不必要的信息,但是代码与Protege和OWL api结合使用。基本上,我希望使用Java编写的算法,并通过语义应用程序控制数据流。因此,编译通常只进行一次(如您所说,动态编译或预编译),但代码的使用是连续的,应该独立于我为构建这样的框架而编写的内容。这意味着我事先不知道将要使用的类或方法的名称(它们将由用户在本体上定义)。。。所有作为JDBC驱动程序实现的连接器或驱动程序类都是预编译类。。使用class.forName加载到内存中,它们的频率通常很高,因此假设对t1.newInstance的调用是ok的,那么使用此方法是ok的。。。但你可能想根据需要调整它。。。但是使用反射并不可怕。。就效率而言,如果你这样做的话…我花了一段时间才理解它,但它基本上就是我想要的,非常感谢!!!!我想问你最后两个问题:如果我动态编译类TestDestination,它能工作吗?有一些方法可以按名称调用该方法而不增加太多的计算工作量?请看,延迟的问题是将相关类加载到内存中。这是不可避免的,你需要了解的是。。当你说
java
java将它加载到内存中,然后调用main。这种延误是不可避免的,对吗??因此,您在这里告诉java要做的是,除了加载essentials外,还要加载该
类中给定的外部类。forName(“blah”)
这样做,它需要在文件系统上找到该类,并在创建实例时加载它。接下来是关于动态编译的其他问题,我不明白。。你是想换个班还是什么的??然后编译它??你多久会看到这种情况发生一次??如果需要加载,它是好的。。。你是在寻找类似的东西还是在寻找类似的东西??注意EJB不仅仅是用于web应用程序。。。如果您认为无法正确处理加载和卸载执行,请使用框架