【问题标题】:compile with javax.tools & running without reflection使用 javax.tools 编译 & 运行时不进行反射
【发布时间】:2013-06-18 16:29:20
【问题描述】:

我是论坛的新手,对 Java 编码还很陌生。

无论如何,我正在实现我的 Java 代码来动态编译和运行不同的类,这些类不知道先验,并且可能会随着时间而改变(不太频繁)。 我发现基于 javax.tools 提出的示例 here 非常有用,但是由于我的工作应该稍后实时运行,所以我想尽可能避免使用 Java 反射。 您知道是否存在一种无需使用再膨胀即可运行已编译代码的方法吗?编译后我可以检索一些指向该类的变量,然后使用它来实例化该类?

谢谢提前 卢卡

【问题讨论】:

  • Java 反射非常强大......库和框架利用它可以提供的能力,如果使用正确,它不会那么慢或不可靠。提供替代方案??我不知道...这取决于您想要代码的动态程度以及其他要求和限制
  • 基本上该程序应该用于从一般用途的传感器获取和处理数据。编译不宜过于频繁,但处理和采集可能有较高的频率。但我不是通货再膨胀专家,我只是在site 上播种可能的问题,所以我不知道它的确切局限性。
  • hmmm true ...但是为什么要使用反射从传感器获取信息?只需单独预编译它们,如果您想动态执行它们,只需将它们加载到您的项目中即可
  • 我没有告诉它,以避免不必要的信息,但代码与 Protege 和 OWL api 结合使用。基本上我想使用用 Java 编写的算法并通过语义应用程序控制数据流。因此编译通常只进行一次(如您所说,动态或预编译),但代码的使用是连续的,应该独立于我为构建此类框架而编写的内容。这意味着我事先不知道类的名称或将使用的方法(它们将由用户在本体上定义)。
  • 如果它的预编译没问题......所有连接器或驱动程序类,尤其是作为 JDBC 驱动程序实现的那些都是预编译类......使用 class.forName 加载到内存中,它们通常是高频率的所以假设它没问题

标签: java reflection dynamic-compilation


【解决方案1】:

嘿,看看我不知道这是对的还是你想要的,但我会这样划分框架......

界面界面只是为了便于理解。

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 是有效的......如果错了请纠正我

【讨论】:

  • 好的,所以调用 t1.newInstance 就可以了,看看example 所以可以使用这种方法……但你可能想根据需要调整它……但反射并不可怕使用 .. 就效率而言,如果你这样做的话......
  • 我花了一段时间才理解它,但它基本上是我正在寻找的,非常感谢!!!!我想问你最后两个问题:如果我动态编译类 TestDestination 是否有效?有一些方法可以在不增加太多计算量的情况下也可以通过名称调用方法?
  • 看,延迟的问题是将相关的类加载到内存中。这无论如何都无法避免,您需要了解的是..当您说java <classname> java 将其加载到内存中然后调用main。延迟是无法避免的,对吗??所以你在这里告诉java要做的是除了加载必需品之外,加载class.forName("blah")中给出的外部类,所以它需要在文件系统上找到类并在你创建实例时加载它等等。提问其他关于动态编译的问题
  • 我不明白..你是想改变班级还是什么??然后编译它??你多久看到一次这种情况??如果只需要加载它很好...您是在寻找类似ejb 的东西还是在寻找类似的东西?注意 EJB 不仅仅适用于 Web 应用程序……如果您认为无法正确处理加载卸载执行,请使用框架来完成
猜你喜欢
  • 2012-11-21
  • 2014-07-29
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 2023-03-06
相关资源
最近更新 更多