问题标签 [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 - 从另一个类加载器加载具有接口的类
我有一个Foo
实现IDoMagic
接口的类。该类Foo
由系统类加载器加载,IDoMagic
接口在第三方组件中定义,我认为它将接口加载到另一个类加载器(动态类加载器)中。
当我尝试创建 的新实例时Foo
,我得到了NoClassDefFound
for IDoMagic
。我认为这是因为它是由不同的类加载器加载的。
我试图创建一个BridgeClassLoader
(类似于 Guice 使用的),然后Foo
从系统类加载器加载类,并从不同的类加载器加载所有其他类,我认为这是用于IDoMagic
但没有任何成功的类加载器。
有办法解决吗?
java - 排除具有动态类加载的类
我正在尝试构建一个中型 Java 项目,以使其尽可能模块化和可扩展。为此,主架构将只负责加载可能在运行时提供的 jars(模块)中的一些类。这种解决方案显然需要动态类加载,但它会将组件的耦合降至最低。
现在,问题来了。每个模块都可能依赖于某些库(例如 Hibernate、Spring ...)。为了避免依赖地狱,我将所有库与架构接口一起放在一个项目中,并将该项目作为所有模块的依赖项。理想情况下,我想从类加载中动态地排除这个依赖项目,以避免在运行时出现问题。
这是我的问题:
- 首先,这是个好主意吗?有没有更好的方法来解决我缺少的这个问题?
- 这是我应该关心的事情吗?或者我不止一次包含相同的课程这一事实不会成为问题?
- 如果这是一个问题,那么从加载中排除这些类的最佳方法是什么?我正在考虑按包过滤它们,但我不确定。
我仍然不太确定是使用这种架构还是使用 Maven 静态构建整个项目,不包括每个模块上的依赖项项目。
任何关于如何进行的建议都非常感谢。
目前我正在使用 Maven 构建和 Spring 作为框架,但我不介意添加其他技术。
谢谢你。
java - AbstractMethodError 与动态 java 编译和类加载与反射
我正在尝试以下 wrt Refleciton,让我知道这是否可能
我将上述类打包在一个 jar 中,并让它在 JVM 上运行。现在我试图在运行时创建另一个类,在运行时编译它并尝试使用反射来调用 B 类的执行函数()。
反射代码:
Classloader = 应用程序 jar 的 url 和 C.class 的 url,在运行时编译。父加载器 - Thread.currentThread().getContextClassLoader() 我还将当前线程的上下文类加载器设置为上面创建的类加载器。
我能够获得该方法并且调用也被调用。但是,当调用 B 类的执行时,它试图调用 doWork(),然后我遇到了 AbstractMethodError。在查看异常时,我发现异常发生在不正确的类加载器/jar 中。但我不确定如何解决我的情况。
有人可以帮忙吗?
java - 如何使自定义 ClassLoader 由 LoadedClass.class.getClassLoader() 返回?
我想创建一个类加载器,通过几个第三方 jar 扩展类路径。目前我的代码如下所示:
问题是即使类加载使用ClassLoader#loadClass
工作正常,#getClassLoader
加载类的方法返回原始类加载器而不是自定义类加载器。这种状态会导致调用喜欢classFromJar.newInstance()
抛出ClassNotFoundExeption
,因为originalClassLoader
不知道额外的 jar,因此classFromJar
无法加载依赖项。
如何使自定义类加载器将自身传播到Class#getClassLoader
已加载类的结果?
我想纯粹在运行时实现这一点,而不需要自定义“java.class.path”系统属性或 JVM-Djava.system.class.loader
开关。
java - Java 类加载器俄罗斯娃娃
是否可以在 Java 中创建一个加载(或更恰当地重新加载)自身的类加载器?
它最初可以由默认的类加载器加载。我想象一个 Java 系统,它能够在通过编译和加载周期运行时进行自我修改。如果是这样,您可以创建许多继承自俄罗斯娃娃加载器的对象,以动态更新它们的逻辑。
java - java中的RMI动态类加载,如何在localhost上分离和启动代码?
我对动态类加载机制的工作原理有点困惑。我实现了下面的类,当它们都在同一个 src 目录中时,我从我的 ide、服务器和客户端工作中启动它们。但是当我将它们分开时,我无法使其工作。有许多指南解释了 RMI 的工作原理等,但他们没有解释我应该如何分离文件并启动它们,一切都很好。
所以我做了什么:编译所有类并获得相应的 .class 文件。然后我创建了一个文件夹和子文件夹来分隔客户端、服务器和公共类:
这是一个家庭作业问题服务器和客户端都将在 localhost 上工作。无论如何,然后当我启动服务器时
它找不到课程
那么我应该怎么做才能让它工作呢?我的分类正确吗?我应该如何启动服务器和客户端?谢谢。
您可以在下面找到我的课程:
java - 如何使用 ClassLoader 或 Class 以编程方式加载 Class
我有两节课
这是在 C:\NNK\pack2 中。完全限定名称是 pack2.eg
另一个程序是
该程序位于 C:\NNK 我必须在此处加载 eg 程序。我试图在 Oracle 中学习它,看到了它的其他相关堆栈溢出问题。 在Java中动态加载一个类 但它不起作用我不断收到错误b是未知的,z是未知的符号。还有一种方法可以使用目录文件名(例如:C:\NNK\pack2\eg)来加载一个类
java - 动态类编译器类加载器抛出 NullpointerException
我是加载类的新手,所以如果有任何问题请帮助我。
线程“main”中的异常 java.lang.ClassNotFoundException:Hello at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
java - 当我在 Main 类中使用抽象或接口时,在运行时将类添加到类路径时出现 NoClassDefFoundError
我知道 Java 在第一次访问中加载类(创建新实例、调用静态方法或静态字段),但在这个简单的示例中,我尝试执行一个 jar 文件,该文件使用一些在运行时我的 ClassPath 中没有的类。我希望(因为在第一次访问中加载类)在发生异常之前在静态块和 main 方法中打印我的消息。但我得到了“线程“主”java.lang.NoClassDefFoundError:com/example/DateAbstract 中的异常,但没有打印任何内容。当我在主类中使用抽象类或接口时发生这种情况,该类或接口位于另一个 jar 文件中。
在我的另一个罐子里:
当我使用此代码在运行时将我的类添加到类路径时。没有改变。在执行静态块之前我得到了执行。
问题:为什么会发生这种情况以及如何解决?
android - how to build an APK and separate libraries that the app loads dynamically
The short summary is: How do I build an APK and separate libraries (by which I mean sets of classes (and ideally, resources too) in some form, such as JAR, AAR or DEX files), but not include those libraries in the APK; instead, the app loads them at run time?
Detail
So my main question is how to build such an app (e.g. Gradle configuration). How do I specify which classes go into which JAR or DEX files? Do I create an Android Studio module for each DEX file I want to end up with?
A closely related question is how the Java code should then load the external libraries and access their classes at run time. For the latter, I'm hopeful that the approach shown at accessing to classes of app from dex file by classloader would work.
I've tried the instructions at https://developer.android.com/studio/projects/android-library.html, but that builds an APK that does include the dependency library.
I've also tried Multidex (https://developer.android.com/studio/build/multidex.html), but that doesn't seem to leave the developer any control over which classes go in which DEX file, and furthermore, packages them all into a single APK. AFAICT there is no way to control the loading of these DEX files at run time.
Background
There's a possibility of the "X-Y problem" here, so I'd better explain the background.
I'm building an app for a client. It's not going to be distributed through an app store, so it won't have access to the normal mechanism for updates. Instead, the client wants the app to be able to update itself by downloading new components of itself to replace the old components, without a need to manually sideload a new APK. The primary motive here is that the updates have to be easy for non-technical users. If the app can control the update process, it can make it smooth and guide the user.
Moreover, the app will be used in areas where internet access is scarce and expensive, so the client wants to be able to issue app updates in smaller chunks (e.g. 2MB) rather than forcing the user to re-download the whole app to receive a small update.
One aspect of the requirements I should mention, in case it matters, is that the libraries to be loaded at run time are supposed to live on a microSD card. This can also help with distribution of updates without internet access.
The current status of the app is that it's about 50% written: That is, a couple of earlier versions have been released, but the app now needs to be modified (restructured) to meet the above requirements, as well as others.