相关疑难解决方法(0)

为什么System.setProperty()不能在运行时更改类路径?

我正在提到有关以编程方式更改类路径的问题.

我阅读并发现System类下有一些函数作为getproperties,我们可以在其中检索属性,然后也可以使用setProperties()进行设置.

我得到的答案是,它不会工作.我自己没试过,但是,我正在接听电话.

只是为了澄清一下,如果这些setProperty()和getProperty()方法在运行时无法改变它们,那么为什么会这样.或者这仅适用于classpath属性?

如果有人可以提供他们真正有用的场景,我将不胜感激?

java classpath

16
推荐指数
3
解决办法
2万
查看次数

Java类加载器如何为"常规"环境工作(非明确使用类加载器)

我正在研究类路径的动态修改.我找到了一个可以正常工作的解决方案,但它使用显式调用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 classloader

5
推荐指数
1
解决办法
3132
查看次数

在运行时加载jar会导致NoClassDefFoundError/ClassNotFoundException

简介: 从正在运行的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文件加载和卸载插件.

关于这个问题的研究我已经做过:

我已经阅读并且未能得到以下方面的帮助:

  • 这个问题,只解决了单个方法的问题,并没有解决类间依赖性错误;
  • 这个问题,这是行不通的,因为每次加载或卸载jar时我都无法关闭并重启程序(主要是我刚才提到的插件部分);
  • 这个问题,只适用于程序启动时存在依赖关系的情况;
  • 这个问题与#2有同样的问题;
  • 这个问题与#3有同样的问题;
  • 这篇文章,我从中了解了隐藏的loadClass(String,boolean)方法,但尝试使用truefalse值并没有帮助;
  • 这个问题与#1有同样的问题;

和更多.没有任何效果.

//编辑: 我到目前为止所做的尝试:

我一直在使用URLClassLoaders加载使用的jar试图JarEntriesJarFile类似这样的问题.我既使用和调用试过这种URLClassLoaderloadClass(String)方法,并通过使扩展一个类URLClassLoader,这样我可以利用loadClass(String, boolean resolve),试图迫使 …

java dependencies runtime jar classloader

5
推荐指数
1
解决办法
2704
查看次数

标签 统计

java ×3

classloader ×2

classpath ×1

dependencies ×1

jar ×1

runtime ×1