问题标签 [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.

0 投票
2 回答
2562 浏览

jboss - 从 OSGi-bundle 在 JBoss 7.1.1 中动态加载类时发生 ClassNotFoundException

我在 JBoss 7.1.1 中部署了一个简单的 OSGi 测试包,并尝试通过执行动态实例化 Jacorb ORB

我得到的只是

我已经做了什么:

  • 在 JBoss 配置中,standalone.xml我为 osgi-subsystem 添加了能力<capability name="org.jacorb" startlevel="1"/>,以便org.jacorb加载模块。这已经解决了我的测试包安装失败的问题。
  • 我在我的Dependencies-Descriptor中声明了(也尝试过使用和不使用该选项):org.jacorbMANIFEST.MFexportDependencies: org.jacorb export

  • 我将以下内容添加jboss-deployment-structure.xml到我的META-INF

    <?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <module name="org.jacorb" /> </dependencies> </deployment> < /jboss-部署结构>

我还对 ClassLoaders 进行了实验,并意识到 ContextClassLoader 是null. 但最后,我不能将其作为非测试代码来实现,因为Class.forName()无法更改为使用特定的类加载器。

那么为什么我会得到这个 ClassNotFoundException 呢?

提前致谢

亚历克斯

0 投票
0 回答
451 浏览

android - 安卓。使用动态加载的 jar 中的资源

我最后的希望:)

我正在为出租车服务的司机开发一个 Android 应用程序。在此产品的生命周期内可能会发生许多更新,因此我们希望尝试通过内部应用程序来维护它们。所以我写了一个通过互联网读取 jar 的启动器,我摆脱了在 DexClassLoader 的帮助下启动动态加载的代码。我使用通过清单注册的基本活动,但它使用一种动态加载的适配器来执行实际代码。

这样简单的适配器成功链接到活动并被执行。但我也未能使用 setContentView() 动态设置布局。我手动将所有 R 文件放入动态加载的 jar 文件中,但我仍然没有找到如何使用这些资源的解决方案。

真的没有办法做到这一点吗?如果不是,我认为这是一个大笑话:一个人可以从外部位置动态加载和执行几乎任何代码,但他不能使用来自这些位置的资源:(

0 投票
1 回答
913 浏览

java - OneJar 和动态类加载

我们目前正在调查我们的应用程序中 OneJar 的使用(出于多种原因),但我们的应用程序使用了一些 customURLClassloader来加载应用程序扩展。

当捆绑为“OneJar”Jar 时,我们会遇到ClassNotFound异常。有问题的类驻留在捆绑的 Jar 中,我们只是依靠类加载器机制来解决父/子关系。

那是。我们有一个通用interface的存储在捆绑的 Jar 中(应该在父类加载器上下文中)。扩展实现了这一点interface(允许我们调用扩展)并依赖子类加载器使用父类加载器的资源查找功能的能力。

有没有人对此有任何经验或阐明我们如何解决它。

我会对其他类似的机制感兴趣(用于将我们的库 Jar 捆绑到单个 Jar 资源中,不需要使用将所有内容和 Jar 解压缩到单个文件中)

0 投票
1 回答
1512 浏览

java - java.lang.IllegalAccessError:尝试从动态加载的子内部类访问父类中的字段

我正在尝试修改一些现有代码,以便能够动态使用子类将数据导入我的程序。但是我遇到了一个问题。我试图动态导入的类之一包含两个子类,它们访问导致 java 抛出 IllegalAccessError 的抽象父类字段。我写了一个小测试程序来演示我遇到的问题。

调用代码创建 URL 类加载器,加载类,然后调用 do work 方法:

Parent 类包含 3 个 int 字段和一个抽象方法:

子类,当调用do work时,它会创建内部类并尝试访问父数据字段并抛出异常:package jarLoader;

公共类 ChildClass 扩展 SuperClass {

仅在我将子类导出为 jar 并在运行时运行加载 jar 的程序后才会发生该错误。

0 投票
2 回答
1162 浏览

java - JAVA中动态类加载的性能成本

我使用定制版本的 Tomcat 开发应用程序。支持动态类加载,我在测试和开发环境中使用了很多,我也很好奇在生产环境中使用它的影响。

据我所知,由于性能问题,动态类加载不会在生产中使用,因为类加载器会在每次访问时轮询类。

但是,此应用服务器支持配置轮询频率以加载新类。

如果我理解正确,如果我将动态类加载配置为每隔相当长的时间(即 1 小时)轮询一次,我应该避免最不利的性能影响。

在生产中,这种机制的使用方式有限:
1) 无需用户停机的紧急补丁(修复将在第一次关闭时发布)
2) 对我们没有来源的类的永久补丁(遗留第三方库)

这是一个可靠的解决方案吗?

谢谢

0 投票
1 回答
807 浏览

android - 动态活动注册

我有这个关于 Android 活动和 AndroidManifest.xml 的问题。当我使用 Java servlet 并想创建一个“基于模块”或类似于基于插件的服务器时出现了这个问题。这工作正常,我可以使用类似于以下的代码方法动态加载我想要的 servlet:Dynamicly add a servlet to the servletConfig。servlet 在服务器启动期间被动态发现和映射。

这里的问题不是如何找到合适的活动,或者如何创建它们的新实例,或者如何启动它们,我已经弄清楚了那部分。我可以遍历我的包并找到适当的活动类,创建它们的新实例并将它们添加到列表中。

我一直在使用interface所有活动都必须实现的,才能成为有效的活动。这样,我可以为我的应用程序创建新的部分、扩展或新功能,并且一切正常。在我的应用程序中,我有一个用户可以单击的按钮列表,并且按钮列表是通过使用ListView.

wherecontent被声明为

ListButtonAdapter扩展BaseAdapter

所以那里没有问题。问题是我必须在 AndroidManifest.xml 中声明我的每一个活动。该文件就像要显示的可能活动的大列表,而且有点混乱,所以我不打算在这里显示代码。

我意识到我必须在清单中添加一项活动,但我希望一项活动就足够了。我的方法在很多方面都可以看作是前端控制器模式,其中每个活动都负责加载和显示他们需要的活动。

我只是问是否可以在清单中动态注册活动(或允许它们以另一种方式运行),如果没有,是否有其他有效的解决方案?

0 投票
1 回答
6751 浏览

java - 如何从运行时加载的类中调用构造函数?爪哇

我有一个类加载器,它从 /plugins 文件夹中的所有 jar 文件加载“主”类,这假设所有 jar 都有包插件。(插件名称)包含名为 main 的类。每个主类都有一个名为 main 的构造函数。

类加载成功,但我需要知道如何从加载的类中调用主构造函数。

(此类/类在运行时加载)

我试过用这个:

但我收到此错误:

0 投票
1 回答
528 浏览

java - 动态加载抽象工厂

我正在尝试创建抽象工厂模式的一些变体。
工厂应该允许像插件一样插入具体工厂的新实现。

例如

我不确定我是否正确地解决了这个问题,或者我是否应该重新考虑我的设计。

0 投票
3 回答
5222 浏览

java - 如何控制哪个 ClassLoader 加载一个类?

眼前的情况并不像标题所暗示的那么简单。

通过 JWS 运行的 Java 1.6_17。

我有一个类,假设MyClass它的一个实例成员变量是来自错误的 3rd 方库的类型,在该类初始化期间,它动态尝试使用Class.forName(String). 在其中一种情况下,它碰巧动态调用: .此类Class.forName("foo/Bar")名称不遵循二进制名称的 JLS 并最终导致java.lang.NoClassDefFoundError: foo/Bar.

我们有一个自定义项ClassLoader,我添加了一个 sanitize 方法ClassLoader.findClass(String)ClassLoader.loadClass(String)解决了这个问题。

我可以这样称呼: myCustomClassLoader.findClass("foo/Bar")

然后加载类没有任何问题。但是即使我提前加载了类,我仍然会在以后得到异常。这是因为在 which 的初始化过程中MyClassBar它们代码最终会Class.forName("foo/Bar")在某个地方调用静态块。如果它尝试使用的 ClassLoader 是我的自定义类加载器,这实际上是可以的。但事实并非如此。它是com.sun.jnlp.JNLPClassLoader不做这种卫生的,因此是我的问题。

我已确保将Thread.currentThread().getContextClassLoader()其设置为我的自定义类加载器。但这(如您所知)没有效果。main()由于我阅读了一些东西,我什至将它设置为我做的第一件事,而且仍然MyClass.class.getClassLoader()是 JNLPClassLoader。如果我可以强制它不是 JNLPClassLoader 而是使用我的,问题就解决了。

如何通过在类初始化期间进行的静态 Class.forName("foo/Bar") 调用来控制使用哪个 ClassLoader 来加载类?我相信如果我可以强制MyClass.class.getClassLoader()返回我的自定义类加载器,我的问题就会得到解决。

如果有人有想法,我愿意接受其他选择。

TL;DR:帮助我强制使用我选择的类加载器Class.forName(String)引用第三方库中的所有调用。MyClass

0 投票
1 回答
2461 浏览

java - 动态外部类加载

我试图在 Java 中获得动态类加载的经验。因此,欢迎任何意见和帮助。我有一个程序允许用户选择一个文件并对其执行一些操作。动作是“命令”,这些是我尝试加载的类。

它的工作方式是:用户将 .class 文件放在所需的文件夹中,我的程序检查文件夹中的文件,如果 .class 文件中有一个类,它会加载它。

我做到了,但不是我想要的。目前,它仅适用于使用我的程序编译的类。但我想要的是我可以将任何包含类的 .class 文件放在文件夹中,然后我的程序会加载它。这是我现在的代码:

如您所见,我尝试了两种方法,第一种方法目前在评论中。我所做的是检查文件夹中的每个文件并检查它是否是 .class 文件,如果是,我会尝试加载该类(如果有的话)。我猜这两者classLoaders只能加载他们“知道”的文件,那我怎么能加载一个外部类。