我阅读并发现System类下有一些函数作为getproperties,我们可以在其中检索属性,然后也可以使用setProperties()进行设置.
我得到的答案是,它不会工作.我自己没试过,但是,我正在接听电话.
只是为了澄清一下,如果这些setProperty()和getProperty()方法在运行时无法改变它们,那么为什么会这样.或者这仅适用于classpath属性?
如果有人可以提供他们真正有用的场景,我将不胜感激?
我正在研究类路径的动态修改.我找到了一个可以正常工作的解决方案,但它使用显式调用addURL()来实现.(大概是在启动时)
但是,如果默认的类加载器似乎无法找到它,我想在运行时拦截类加载过程以找到类.我试图将ClassLoader子类化,因此它只是委托findClass()
和loadClass()
默认,并打印出一个调试行告诉我这些方法已被调用,但是当我的类通过隐式类加载使用依赖类时,它们似乎永远不会被调用,例如
// regular object instantiation with 'new'
BrowserLauncher launcher;
launcher = new BrowserLauncher();
// static methods
Foobar.doSomethingOrOther();
// Class.forName()
Class cl = Class.forName("foo.bar.baz");
// reflection on a Class object obtained statically
Class<Foobar> cl = Foobar.class;
// do something with cl, like call static methods or newInstance()
Run Code Online (Sandbox Code Playgroud)
在这些情况下,类加载如何工作?(相对于显式调用Classloader.loadClass()的简单情况)
这是我在下面的自定义类加载器的尝试.如果我使用带有参数列表的DynClassLoader0.main(){"some.package.SomeClass", "foo", "bar", "baz"}
,并且some.package.SomeClass引用外部.jar文件中的其他类,使用上面列出的方法之一,为什么我的DynClassLoader0的findClass()和loadClass不是( )被叫?loadClass被调用的唯一时间是在下面的main()函数中对loadClass的显式调用.
package com.example.test.classloader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class DynClassLoader0 extends ClassLoader { …
Run Code Online (Sandbox Code Playgroud) 简介: 从正在运行的Java程序加载jar会NoClassDefFoundError
导致由ClassNotFoundException
类间依赖性(例如import
语句)引起的.我怎么能绕过它呢?
问题更详细:
我试图以编程方式加载一个jar文件 - 让我们称之为"服务器" - 通过我自己的Java程序进入Java虚拟机 - 让我们称之为"ServerAPI" - 并使用扩展和一些其他技巧来修改行为和服务器交互.ServerAPI依赖于Server,但如果Server不存在,ServerAPI仍然必须能够从网站运行和下载Server.
为了避免因ServerAPI加载而导致的错误而不满足Server的依赖性,我制作了一个启动器 - 让我们称之为"Launcher" - 这是为了下载Server并根据需要设置ServerAPI,然后加载Server和ServerAPI,然后运行ServerAPI.
但是,当我尝试从Launcher加载jar时,我会收到错误,因为ClassLoaders无法解析文件中其加载的类所依赖的其他类.简而言之,如果我尝试加载Class A
,它会在A
导入时抛出错误,B
因为我还没有加载B
.但是,如果B
还要导入A
,我会陷入困境,因为我无法弄清楚如何一次加载两个类或如何在没有JVM运行其验证的情况下加载类.
为什么所有的限制都让我遇到了这个问题:
我试图修改并添加到Server的行为,但由于复杂的法律原因,我无法直接修改程序,所以我创建了依赖的ServerAPI,可以从外部调整Server的行为.
但是,出于更复杂的法律原因,Server和ServerAPI不能简单地一起下载.Launcher(见上文)必须与ServerAPI一起下载,然后Launcher需要下载Server.最后,可以使用Server作为依赖项运行ServerAPI.这就是为什么这个问题如此复杂的原因.
此问题也适用于项目的后续部分,该部分将涉及基于插件的API接口,该接口需要能够在运行时从jar文件加载和卸载插件.
关于这个问题的研究我已经做过:
我已经阅读并且未能得到以下方面的帮助:
和更多.没有任何效果.
//编辑: 我到目前为止所做的尝试:
我一直在使用URLClassLoaders加载使用的jar试图JarEntries
从JarFile
类似这样的问题.我既使用和调用试过这种URLClassLoader
的loadClass(String)
方法,并通过使扩展一个类URLClassLoader
,这样我可以利用loadClass(String, boolean resolve)
,试图迫使 …