问题标签 [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 - OSGi 中的动态类加载
我有一大堆在 OSGi 上运行良好的框架模块,所有服务和组件都可以相互找到并运行良好。
然而,有一个框架可以对类进行一些动态处理。基本上在某些时候你给它一个类名,它执行 Class.forName() 然后反射魔法发生。
这在标准 jvm 中运行并使用 SPI 将框架连接在一起时效果很好,但它在 OSGi 中失败,因为您尝试通过框架接近的随机类“test.MyTest”当然对所述框架不可见。
它将抛出“java.lang.ClassNotFoundException:框架未找到 test.MyTest”
所以我的问题是:如何解决需要查看所有内容的框架缺乏可见性?Import-Package: *
?
更新
假设自 2010 年以来 OSGi 在这方面没有太大变化,文章http://njbartlett.name/2010/08/30/osgi-readiness-loading-classes.html非常有趣。我目前添加了对主动注册类和通过 OSGi 注入的域工厂的支持。
除此之外,默认解析无论如何都使用上下文类加载器,因此如果所有其他方法都失败,则将用于尝试加载类。
更新
我还添加了对建议DynamicImport-Package
的支持,这对于小型项目来说更容易。
java - 类加载器在运行时没有“加载”jar?
一开始,它一切正常,然后它就停止了,我真的不知道我是否对它做了什么,或者其他地方有问题。
我的类加载器应该在运行时加载一个 jar 文件,但显然它没有。
我不能透露 URL 的完整路径,但我可以确认 101% jar 是字符串 url 所说的位置,但我确实得到了 DefNotFoundClassException。
java - URLClassLoader ClassNotFoundException
I'm trying to write a code that loads classes dynamically at run time
the problem is that this keeps giving me classNotFound exception , tho i'm pretty sure files .class exist in that directory , another thing I've tried loading already loaded classes and it worked , so it doesn't work only if my code doesn't have the class file !!
java - 在 GAE 上以编程方式从内存中编译和加载类
我想在 String 中生成一个 java 源文件,将其编译为一个类并加载该类以运行所有来自 Goole App Engine (GAE) 的代码。那可能吗?
我天真地尝试使用 Java 6 中新的 JavaCompiler 东西,但是我得到了一个例外:
在运行时提示它不起作用。
此外,我尝试将jcompilo包含到我的项目中,但是没有任何文档说明如何使用这个非常密集的库项目从字符串编译程序。
那么我将如何着手实现我的目标呢?
java - 获取 JAVA 中动态加载的类的 .class 文件的路径
我正在寻找实例化和映射给定类型的类路径中的所有类。
我已经使用Reflections
库完成了扫描,并获得了已加载的类列表。
然后,当我映射它们时,我正在检查冲突(关键是简单的类名)。
当这种情况发生时,我想抛出一个异常,指出冲突类的完全限定名称,以及它们被加载的路径(例如,JARs
可以找到每个类的路径)。
我意识到也可以从内存中加载一个类,但是假设我是从JAR
磁盘上加载它,我想知道是否有任何方法可以获取该路径...
请参阅下面的代码片段:
这段代码可以编译——但它不起作用;getClass().getResource(class1.getSimpleName()+".class") 返回 null。我怎样才能得到路径.class
?
java - java中的默认类加载器是将所有内容保存在内存中还是留在文件系统中?
我想知道当你有一个 jar 动态加载到你正在运行的程序中时,jar 中的所有内容(类、资源)是否都存储在 VM 内存中的某个位置?
这样每次您需要访问类或文本资源文件(例如通过getClass().getResourceAsStream)时,可以快速从内存中提取它,而不是再次访问文件系统中的jar?即你可以在那之后删除jar。
抱歉,如果我问错了问题,请将我的问题更改为解释类加载器过程,因为我可能误解了它,特别是对于包装在 jar 中的资源。谢谢你。
java - 名称以斜杠结尾的 getResources 的自定义类加载器问题
我急切地寻求帮助,但无法在网上找到有关此特定主题的任何信息(许多相关主题让我的特定问题未得到解答)。
具体来说,我需要能够从中央和外部代码存储库下载代码(jar)。这是由需要将其添加到类加载器的类路径以供其后使用的引导代码完成的。这是我们进入已经讨论过很多次的主题的时候。我不喜欢黑客,所以我尝试了以下方法:
尝试#1:创建一个为此目的配置的 URLClassLoader 实例,然后通过它调用代码的“其余部分”。
失败:这里有1.5个问题(一个可能是另一个原因)。一是 URLClassLoader 通常更喜欢从其父级加载内容。一些代码必须同时存在于两个版本中,可能是不同的版本。如果使用来自父级的代码,它将继续使用“外部”类加载器进行其余的加载,这不是我们想要的,即使初始加载正常。其次,一些第三方库似乎直接访问系统类加载器,无论是有意还是无意(可能从它加载的类之一中获取)。
尝试#2:创建我的 URLClassLoader 的子类,它更喜欢自己而不是父类。覆盖 loadClass、getResource、getResources、getPackage、getPackages ......以后也可以使用其他方法来确保这一点。
失败:没有帮助(足够)。该第三方代码仍然无法加载某些资源。
尝试#3创建另一个 URLClassLoader 的自定义子类,并使用 -Djava.system.class.loader=... 将其设置为系统类加载器
失败:这效果更好 - 更进一步,但尝试获取资源仍然失败。不过,这一次是不同的资源。我向所有被覆盖的方法添加了日志记录,以记录它们的调用和资源名称。大部分都找到了经常资源。有些人仍然没有,即使他们在那里(确认)。但是,即使我努力学习,我也不知道的是许多资源名称以斜杠结尾的调用。有些还有斜线,通常会出现美元符号(嵌套/内部类资源)。请求但未找到的一些示例:
com/acme/foo/bar/ClassName/ com/acme/foo/bar/ClassName/InnerClassName/
当我使用初始/引导类路径上的所有内容运行下载的代码时(并且不使用我的类加载器),一切正常 - 因此我的类加载器破坏了一些东西,但我需要它工作。
我最接近的猜测是:
第三方代码以某种方式获取了真正的系统类加载器,可能是通过它加载的某个类,然后使用它。我看不到对它的请求,它们肯定会失败,因为它没有整个类路径。
资源名称以斜线结尾的业务是由真正的系统类加载器支持的原因,但不是由我正在继承的 URLClassLoader 支持的原因。我只能猜测预期的返回 URL 以某种方式定位了以该名称为前缀的资源集合。尽管有可能,但这将很难匹配。此外,似乎一些斜杠位于分隔内部类名称的美元符号应该位于的位置,即在上面的示例中(为清楚起见添加了空格):
com/acme/foo/bar/ClassName / InnerClassName/
com/acme/foo/bar/ClassName $ InnerClassName/
请注意,我不能依靠假设它是 URLClassLoader 的子类并使用反射来调用其 addURL(URL) 方法来破解实际的系统类加载器。
有没有办法使这项工作?请帮忙!
更新
我刚刚做了一次额外的尝试。我创建了一个仅记录请求的虚拟包装类加载器(扩展 ClassLoader,而不是 URLClassLoader),然后将它们传递给父类(公共方法)或超类(受保护方法)。我将其设置为系统类加载器并手动将整个“内部”类路径添加到实际的外部类路径,然后尝试运行代码。这可以正常工作,就像没有自定义系统类加载器一样。记录的内容还发现,即使系统类加载器也为这些以斜线结尾的资源返回 null,但不是全部。我没有检查这些是否也适用于我的真实代码,但猜测它们可能 - 因为它们不是绊脚石。不知何故,自定义系统类加载器仍在被绕过。如何?
更新 2
在我的自定义系统类加载器中,我让一些类来自外部/真正的系统类加载器,例如 java.lang 中的那些。我现在怀疑我不应该有,内心的“世界”必须完全孤立。但是,与它进行通信会带来问题,而我剩下的就是反射......但不确定这是否会起作用 - 即是否可以有多个 java.lang.Class 和/或 java.lang 。目的?
reflection - 动态类加载 - 非 JDBC,通用:“找不到符号方法”
我有一些分析数据的代码,并且我意识到我想要一些针对非常特定的数据源而不是通用处理的代码。任何单独的来源都可能随时间而变化,并且已经有几个不同的来源需要考虑。为了处理这种情况,我从 Java 启动了完整的独立程序,这很好,但是有一些问题,我决定改用动态类加载。我从 v 1.1 开始一直在使用 Java,并且通常熟悉大多数 Java 问题,但是这个特定任务让我想知道我是否使用了错误版本的 Java或类似的版本,因为我得到的错误看起来像方法调用我我的版本不知道我正在尝试。我刚在想也许我遗漏了一个重要的进口声明?
我发现了几个很好的例子,其中最好的似乎是这个,因为它完全符合我的意愿:http://media.techtarget.com/tss/static/articles/content/dm_classForname/DynLoad.pdf
代码的第一个示例正是我想做的那种事情,所以,我从中提取了一些内容 - 与我自己做的事情(我一直在努力)没有太大不同,但它不会t 编译 - 各种“找不到符号”错误。由于我的代码更加庞大,我自己尝试了它们,它也不会编译,和我的一样!这是该代码:
当我尝试编译它时,我得到:
我的java版本:javac 1.7.0_45
我想问题很简单/基本,但是查看文档没有任何线索!
java - Unsafe defineAnonymousClass 和 ClassLoader 之间的不同行为
我使用类加载器和 Unsafe::definedAnonymous() 来加载生成的字节码 byte[]。classLoader.loadClass() 返回的 Class 的使用成功,而c.getMethod()
在哪个c=Unsafe.defineAnonymousClass()
API 中失败。那么生成的字节码是错误的吗?
我的代码:
错误是:
生成的字节码是:
这个字节码对应于内联一个 Callee 方法。
我检查了这个字节码序列,似乎没有错误。错误信息中的变量 3 出现了 4 次,其中:
对应的方法是:
}
java - 在类路径之外的 jar 中动态加载顶级类
更新- 我项目中的所有文件现在都声明了同一个包。但是,我正在加载的 jar 必须在类路径之外。我试过child.loadClass(className)
and Class.forName(className, false, child);
,但他们似乎都找不到它。
我正在编写一个程序,它希望以 jar 的形式获取插件或模块,并像嵌入类路径一样使用它们。
我在这里和其他网站上看到了很多类似的问题,所以我为重复道歉。但是,到目前为止,我看到的每个答案都没有奏效。难道我做错了什么?
我有一个装满罐子的文件夹。我知道每个 jar 都有一个扩展我的 Module 类的顶级类。但是,我不知道这些类叫什么。
首先,我找到目录中的所有文件。这很好用。然后,对于每个文件,我尝试使用以下代码获取其顶级类的实例:
(首先它将 jar 作为 zip 打开以获取所有类的名称,然后查看名称以判断它是否是顶级类,如果是,则应该加载、实例化并返回它。)
它达到了“试图加载......”,它显示了我所期望的类的名称,然后抛出一个java.lang.ClassNotFoundException
.
当我将它放在源目录中的 .java 文件中时,使用相同的名称加载类工作正常,但它不会从 jar 中获取它。
难道我做错了什么?我怀疑类名可能需要某种前缀或后缀,但我不知道是什么。
谢谢你的帮助!