问题标签 [urlclassloader]
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 - 使用defineClass从字节动态创建类
似乎我应该能够使用派生的类加载器来做到这一点,URLClassLoader
其中包括loadClass()
:
然后我从一个类文件中读取字节并调用上面的 loadClass 方法。我明白了:
java.lang.NoClassDefFoundError: com/samples/SampleClass (wrong name: com/samples/SampleClass)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
奇怪的是名字和“错误的名字”是一样的。两者都是正确的包装。
如何获得NoClassDefFoundError
正确的预期名称?有可能做到这一点defineClass
吗?
使用不推荐使用的形式,没有类名,可以完美地工作:
谢谢
class - Java 动态类加载在 Windows 上失败,但在 linux 上工作正常
我正在尝试从 jar 文件动态加载一个类。它在 Ubuntu linux 机器上运行良好(Sun Java 版本 1.6.0_24 (b07)。
当我尝试在 Windows(Windows 7,Java 版本“1.6.0_14”)上运行相同的东西时,它失败并出现 Class Not Found 异常。
以下是代码:
在 Linux 上运行时,jar 位于根目录下,对于 Windows,它位于 c:\(源代码和二进制文件位于 C:\ 上的某个文件夹中,因此“/sqljdbc4.jar”在 Windows 上解析为 c:\sqljdbc4.jar,我有确保将正确的 jar 位置传递给两个平台的类加载器。
以下是我在 Windows 上获得的堆栈跟踪
注意:您可以使用任何您必须尝试的罐子。我在玩 MS SQL Server JDBC Driver jar。
谢谢 !
-阿比吉特。
jms - 使子 CL JMS 接口在父 CL 中可用所需的狡猾的类加载器解决方案/hack
我正在编写一个多供应商 JMS 适配器,一些愚蠢的许可问题引发了对狡猾的类加载器解决方案/hack 的需求——它不会很漂亮,但我很想听听专家的一些巧妙想法类加载器黑客在那里......
架构很简单——适配器的所有代码都在系统类加载器中,并大量使用 Sun 的 J2EE javax.jms.jar 中的接口,然后根据类路径信息在子 URLClassLoaders 中加载各个 JMS 提供者对这些接口的实现从一些 XML 配置文件加载。
这一切都很好,直到我们意识到 Sun 的 J2EE JMS jar 受一个非常烦人的许可证管理,该许可证阻止我们重新分发它(即使它包含的只是行业标准接口!)所以我们不能把它放在系统类路径中连同我们的开箱即用代码。但是,如果客户被迫从 Sun 网站查找并下载 jar,然后将其复制到我们安装中的正确位置以使其正常工作,最终用户体验将非常糟糕。考虑到我们正在加载的 JMS 提供程序实现必然已经在我们自己的 JVM 中加载了所有这些接口,因此对客户施加这样的刺激似乎是一种耻辱——唯一的问题是它们位于特定于提供程序的子类加载器中意味着他们'
所以我很想听听任何聪明的想法来解决这个问题(如果可能的话!)。
例如,我想知道尝试在自定义的 urlclassloader 子类中加载我们的主类,而不是使用系统类加载器(尽管这将是相当痛苦的,因为我们必须重现现有 MANIFEST.MF 类路径引用的效果)并提供该类加载器对其中一个子类加载器的引用(一旦我们解析了我们的 XML 配置),因此它可以(仅)从子类加载“javax.jms.*”接口(颠覆正常的父优先策略,并忽略供应商- 同一个 jar 中的特定类,不得在父级中加载)。我想知道这是否可行,是否有人有任何指示。一世' 我注意到主 CL 中的一些适配器类正确加载,尽管有引用缺少的 JMS 接口的方法(但在调用这些方法时显然会失败) - 我是否正确地认为,如果可以提供包含这些类的 CL在调用此类方法时(但在加载类之后)访问 JMS 接口,那么它会起作用吗?(或者已经太晚了……)
(仅供参考,我已经发现了两个相关的 stackoverflow 帖子,它们提供了一些有用的上下文,但不能完全帮助解决这个特定的问题:How do you change the CLASSPATH within Java?和How do I create a parent-last / child-first ClassLoader in Java ,或如何覆盖已在父 CL 中加载的旧 Xerces 版本?)
非常感谢你帮我解决这个问题!:)
java - 如何从给定的 URL(用于 bean 实例化)制作 Spring 加载类?
有没有办法告诉 Spring 在实例化 bean 时从给定的 URL 加载类?我需要从不在类路径中的位置加载类。如果我使用的是纯 Java,我可以使用URLClassLoader
,但我如何在 Spring 中实现这一点?我正在使用 Spring 3.0
java - 从文件夹加载类而不指定包
我有一个应用程序,它允许人们使用抽象类编写自己的实现。我将这些实现作为 .class-files 从目录加载。目前,我有这个解决方案:
如您所见 - 我需要指定类所在的包才能正确加载它们。省略包,我得到一个
错误。
现在,从架构 POV 来看,我认为其他人设计的类在加载它们时必须编译到 MY 包中,这是非常糟糕的设计。
所以我问你:有没有一种方法可以从文件系统中加载类,而不必指定它们所在的包?
java - Java有没有办法加载一个已经被系统类加载器加载的类?
(可怕的标题,我知道)
解释这一点的最好方法是,我需要加载一些将在运行时从 URLClassLoader 加载的类,因为这些类引用了系统类加载器已经加载的类的实例并且它们无法重新加载,因为的一些其他问题。
此外,我愿意更改我的代码,以便可以使用 System ClassLoader 从类路径中的 jar 加载类,但我无法做到这一点。
java - Java 如何使用 System ClassLoader(无 URLClassLoader)从类路径中的 jar 中加载类?
因此,我需要在运行时使用 System ClassLoader 从类路径中的 jar 中加载一些类,但每次尝试时,我都会收到 ClassNotFoundException。使用系统类加载器,我可以只做:xyclassineed(x 和 y 是包)还是我必须做类似的事情:pathtox.xyclassineed,假设它甚至可以做到这一点?
java - 带有 ClassLoader 的 Java 示例
我有一个小问题。我学习 java SE 并找到类 ClassLoader。我尝试在下面的代码中使用它: 我正在尝试使用 URLClassLoader 在运行时动态加载一个类。
java虚拟机看不到我的课,我得到以下异常:
你知道我该如何解决这个问题吗?
java - 防止第 3 方类加载器加载类
我正在调用第三方代码
它有一个加载类的类加载器。是否有可能阻止它加载特定的类?此外,我正在调用超过三分之一的部分程序,并且我正在寻找一种广泛的解决方案,该解决方案通常会阻止子类加载器加载特定的类,看看子类加载器如何首先委托给父类这可能吗?
java - URLClassLoader 不读取插件的外部 JAR 库
我已经用 Java 实现了一个简单的基于插件的应用程序。主插件类派生自称为“插件”的抽象类。应用程序从 JAR 文件中读取该类并通过创建该类的实例来运行插件。我猜是标准程序:)
直到现在一切都很好。但是当我在我的插件中包含一个库时会出现问题,比如 MySQL 连接器。执行后抛出异常 NoClassDefFoundError 和 ClassNotFoundException。我通过将 MySQL 连接器库添加到主应用程序来克服这个问题,但那有什么意义呢?:)
我不是 Java 专家,所以我不确定是否有任何替代解决方案,例如为库定义类路径等。
这是我的插件加载器:http: //pastebin.com/90rQ9NfJ
这是我的插件基类: http: //pastebin.com/Juuicwkm
我正在从 GUI 执行: