问题标签 [dynamic-class-loaders]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在代码中编译,没有得到我想要的行为。
所以我有一些代码 - 我想编译字符串'temp'然后执行它,然后更改字符串,重新编译并执行。问题是目前它只是首先执行代码的第一位。
我预计:
我得到:
完整代码如下,任何帮助表示赞赏。
java-compiler-api - 使用 Java Compiler API 编译多个 java 文件
您好我需要创建、编译和加载 java 类运行时。使用 FTL 我正在创建 java 源文件,并且如果没有动态依赖项,则能够编译源代码。
用一个实例来详细说明,我有两个java源文件,一个接口及其实现类。我可以使用 java 编译器 api 编译接口,如下所示
我为已经在 classpath 中的静态类设置了类路径,但是这种方法不适用于动态创建的类?任何自定义类加载器都可以解决这个问题吗?我的最终实现将在 web/app 服务器中
任何反馈将不胜感激
萨西什
java - 从文件夹加载类而不指定包
我有一个应用程序,它允许人们使用抽象类编写自己的实现。我将这些实现作为 .class-files 从目录加载。目前,我有这个解决方案:
如您所见 - 我需要指定类所在的包才能正确加载它们。省略包,我得到一个
错误。
现在,从架构 POV 来看,我认为其他人设计的类在加载它们时必须编译到 MY 包中,这是非常糟糕的设计。
所以我问你:有没有一种方法可以从文件系统中加载类,而不必指定它们所在的包?
java - 如何在运行时从 jar 文件中加载实现接口的类?
我想实现一个可以使用用户实现的类的应用程序。每个类都应该实现一个接口,我定义接口,最后,所有由用户实现的类,归档在一个 jar 文件中。用户将 jar 文件复制到类路径中,然后只将 jar 文件名提供给我的应用程序。我的应用程序应该能够动态加载 jar 文件。为此,我发现这篇文章非常有用,但它按类名加载类。我想根据他们的父母加载课程。
假设加载的 jar 文件同时具有A
和B
类。我想B
通过知道iB
接口名称从类中获取一个实例。
我该怎么办?
java - 释放类加载器时,何时在单例上调用 finalize?
“已发布”是指没有对剩余类加载器的引用。
我们遇到了一个问题,经常重新部署的 Java EE 应用程序会占用 permgen 空间。分析表明,Java EE 应用程序中的单例已经传递了对应用程序外部应用程序类加载器对象的引用(违反了 Java EE 规则),并且在取消部署应用程序时没有清除它们。
假设没有其他对单例或类对象的引用,当其类的类加载器被释放时,单例的 finalize() 是否会被调用? 我想清除那里的流氓入站引用。或者我是否在一个 catch-22 中,直到类加载器本身可以被垃圾收集之前,finalize 才会被调用——因此永远不会因为流氓外部引用而被调用?
这里的主要问题可能是:
在这种情况下,类对象的类加载器还不能被垃圾收集吗? 这可能取决于类加载器行为的规范,或者可能取决于实现。
参考(另一种!;-))将不胜感激,但不是必需的。
java - JUnitCore 未加载测试用例所需的库
我正在尝试编写一个动态运行外部类测试的方法。我能够运行仅使用 JDK 库的测试,但是当我运行使用另一个库(例如 org.jmock.Mockery)的测试时,JUnitCore.run(args) 返回的 Result 对象有以下错误:
不用说,如果我从 Eclipse 中的原始项目运行它们,测试就会运行并通过。
我相信这个问题与类路径有关,因为 ClassLoader 似乎只加载正在测试的类,而不加载外部项目的类路径中定义的依赖项(如 jars)。我不知道如何将 jar 动态加载到正在执行的应用程序中。
下面是加载类和运行测试的代码。
提前致谢,
马克卡奇亚
java - 并非所有类都使用自定义系统类加载器
我正在实现一个功能,该功能需要在多个 JVM 实例(通过网络)之间传递动态生成的类型(以二进制表示,用 Kryo 序列化)。为了正确解决加载哪些类型以及不加载哪些类型,我使用了自定义系统类加载器(作为 java-Djava.system.class.loader
参数传递),其他动态创建的类加载器将其用作父类。这个自定义系统类加载器知道它的子类,如果它找不到一个类,可以询问这些派生类加载器是否有它(这与类加载器的标准层次结构相反)。
这些动态生成的类型可以完美地在不同的 JVM 之间传输和加载。当我尝试反序列化引用动态生成的类型之一的某种类型的实例(从磁盘加载相应的类并且对于所有 JMV 都是相同的)时,就会出现问题——ClassNotFoundException 由 Kryo 的实例引发,它试图readClass
按动态生成的类型的名称。
在方法内部readClass
调用Class.forName
,它不使用指定的自定义类加载器(知道所有动态生成的类型),而是使用 sun.misc.Launcher$AppClassLoader 实例。
是否可以指定自定义系统范围的类加载器,以便所有类都加载它以避免所描述的问题?
更新
进一步分析发现,ClassLoader.getSystemClassLoader()
实际上返回的是指定的自定义系统类加载器。幸运的是,Kryo 库支持设置自定义类加载器,专门用于在反序列化时加载类。这两个事实构成了解决上述问题的基础。
java - 如何仅使用类名加载类
我需要使用 Java 的 Class.forName("") 来加载我的一个类。问题是我需要通过只指定类名而不是完全限定的类名来加载类。
例如,这可行,但不符合我的要求:
Class.forName("reflection.Person");
这就是我需要但不起作用的东西:
Class.forName("人");
任何人都知道如何让#2工作?我只需要使用简单的类名。任何第 3 方工具将遍历我的文件夹结构以检查该类是否存在?这将被部署为一个可执行的 JAR。
提前致谢。
java - 动态类重新加载仅在调试模式下有效,为什么/如何真正起作用?
我有一个棘手的问题。
我的java程序正在循环中做这样的事情:
环形:
将已编译的 java 类的外部文件读入 byte[] 数组。
创建我自己的类加载器的新实例。
setbytes 从读取的文件到这个类加载器实例。
使用创建的类加载器从外部文件创建类对象的新实例。
调用创建对象的任何方法。
问题出在哪里。
当我在调试模式下运行这个程序时,它的行为与我预期的一样,所以如果外部文件更改类加载器加载新版本的类并执行新版本(如果文件没有改变它当然也会加载旧版本)。
但是当我不在调试模式下运行这个程序时,它总是执行旧版本,尽管读取的文件已经改变。
也许对类加载问题和 JVM 行为有更深入了解的人可以向我解释这种行为。
java - JSP 的 Tomcat 类重载
在重新加载 JSP 时,类重新加载在 Tomcat 中是如何工作的(我说的是内部架构)?
我知道每个 JSP 都被编译成一个 Java 类。但是,考虑到类加载器不允许卸载类并且不收集太多垃圾,类加载器(每个 Web 应用程序都是唯一的)如何重新加载这些生成的类?