问题标签 [classloader]

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.

0 投票
3 回答
4151 浏览

java - java中加载的类数

我有一个程序,那里加载的类数量不断增加。

这怎么可能?还是我误解了java中关于类加载的一些东西?

这是 jConsole 一夜之间的一个片段:

替代文字 http://img200.imageshack.us/img200/200/classesp.jpg

有人可以告诉我这种持续增长的类加载的可能原因是什么?或者这是正常的吗?

谢谢

0 投票
2 回答
729 浏览

jvm - Websphere 6.1(IBM JVM)中的类加载器地址怎么可能发生变化

我在连续的 javacore 转储中观察到类加载器的地址在 Websphere 6.1 (IBM JVM 1.5.0) 中发生了变化。类加载器下面的类具有不变的地址。那么在新地址上不是同一个类加载器吗?

例如在第一个 javacore

2CLTEXTCLLOAD 加载程序 com/ibm/ws/classloader/CompoundClassLoader(0x00002AAABF5BB7F0)
3CLTEXTCLASS org/eclipse/emf/ecore/EObject(0x00002AAB24684B30)

在后来的 javacore

2CLTEXTCLLOAD 加载程序 com/ibm/ws/classloader/CompoundClassLoader(0x00002AAABF5AB6E0)
3CLTEXTCLASS org/eclipse/emf/ecore/EObject(0x00002AAB24684B30)

之前在 0x00002AAABF5BB7F0 的类加载器下的同一个类,现在类加载器在 0x00002AAABF5AB6E0

我试图找出一个类卸载问题,这似乎并没有让挖掘堆转储时的生活更轻松。

0 投票
1 回答
569 浏览

java - 从 jar 中提取类时出现 ClassNotFound 异常

我一直试图从 .jar 文件中获取一个类,但没有成功。.jar 位于 C:\CTF.jar 并在名为 CTF 的文件夹中包含一个 .class 文件 CaptureTheFlagRules。以下代码不起作用:

代码在 forName() 调用中通过 ClassNotFoundException。我需要做什么才能上课?

0 投票
4 回答
2288 浏览

java - Javaagent 类卸载

我有一个检测字节码的 java 代理。我正在使用 java 6 中的附加 api 来允许用户使用我的 java 代理动态加载代理和仪器以及 deinstrument 代码。我正在使用 Boot-Class-Path 清单属性来确保我的 javagent 类位于引导类路径中,以便我的用户可以检测 ArrayList 等类。

但是,问题来自版本控制。假设用户动态附加了我的代理的版本 1。然后我给了他第 2 版。现在,自从他附加了我的代理的第 1 版后,他的应用服务器从未关闭过,所以第 1 版的类仍在加载。

我需要一些方法,以便当我的 javaagent 客户端版本 2 时,版本 1 被卸载。

我知道一种方法是为我的 javaagent 的类编写一个客户类加载器,并将类加载器引用设置为 null。但是在这种情况下,我将无法在引导类路径中检测类,因为我的类加载器将位于引导类加载器的层次结构中,因此我的用户无法检测像 ArrayList 这样的类,因为如果我在 ArrayList 的方法中添加一个调用到我的一个代理类的方法,引导类加载器将无法看到它们。

那么有什么办法可以解决引导类路径问题,并且仍然卸载以前代理的类吗?

0 投票
1 回答
914 浏览

jboss - 战争中的罐子 - NoClassDefFound 异常

我在 jboss 上部署了 2 个应用程序作为 app1.war 和 app2.war。这两个应用程序使用一个通用的 java 包,例如 myPackage。早些时候我的战争看起来像这样

==================================================== =======================

app[12].war/
-----web.xml
-----app 特定类(.class 文件之类)
-----appClass1.class
-----appClass2.class 等..
-- ---WEB-INF/
-----myPackage/ (这只是war下的一个文件夹,不是jar包)
---------属于普通包的类如
---- ------common_class1.class
----------common_class2.class
----------。
----------。

==================================================== ======================

但这会产生问题,因为这两组通用类在两个 war 文件中都具有完全相同的名称等。所以我决定将通用包编译为 jar 文件并将其放在每个 war 文件的 WEB-INF/lib 中,现在我的 war 文件看起来像

==================================================== ===========================

app[12].war/
-----web.xml
-----app 特定类(.class 文件之类)
-----appClass1.class
-----appClass2.class 等..
-- ---WEB-INF/
----------lib/
----------myPackage.jar(这现在是一个jar包)
---------- myPackage/
---------------属于通用包的类,如
---------------common_class1.class
-------- -------common_class2.class
---------------。
---------------。

==================================================== ===========================

但是现在我的应用程序特定类需要使用 myPackage.jar 访问类文件抛出 java.lang.ClassNotFoundException 异常。

我在谷歌上搜索了 3-4 个令人沮丧的小时,但没有解决这个特殊问题。我可能在做一些非常错误的事情。有足够聪明的人可以帮帮我吗?

PS:我在 JBOSS 4.2.3 中部署我的战争

万分感谢。〜马诺伊

0 投票
1 回答
1980 浏览

junit - Eclipse RCP: Using different JUnit version (4.3.1) than shipped with eclipse galileo (4.5.0)

Hallo,

I have the following situation:

We are developing an Eclipse RCP Application and want to switch from Eclipse 3.4 to Eclipse 3.5. Our JUnit-Tests are using JUnit 4.3.1 and we have a launch configuration to start our test suite. I think I don't need to go into more details here.

The problem is:

Running the tests with Eclipse 3.5 does not work: JUnit cannot find any annotations in the test classes (neither (at)Test nor (at)RunWith).


I patched the junit library with some logging output to check what is going on. I found out that this problem is a classloading issue:

The test class passed to JUnit 'lies in' a ClassLoader which is different from the one JUnit uses to load the annotation classes like 'RunWith'. This is not the case in Eclipse 3.4

The first line prints another classloader than the second line. This is bad because JUnit cannot match the annotations in the test class with the Annotation-Class (here: RunWith.class): "RunWith" in CL1 is not equal to "RunWith" in CL2.


I have a solution which points to the core problem: Replace JUnit 4.5 in Eclipse Galileo with JUnit 4.3.1 so that there is only one JUnit-Version: The Test-Run and the tests classes are both using JUnit 4.3.1 (I had to patch "org.eclipse.jdt.junit4.runtime" to accept an ealier junit version).

I think I can also replace JUnit 4.3.1 in my test class with Version 4.5, but that is not an option yet.

Guess: The classloaders are different because the classes 'come from' different JUnit-Bundles: the testclass with its annotations from version 4.3.1 and the test runs in version 4.5

What I want to know: Is there any other solution besides patching Eclipse (replace JUnit versions)? Any commandline argument or such? Any configuration to force Eclipse to Use JUnit 4.3.1?

Any hints on the above described analysis are welcome!

0 投票
2 回答
2611 浏览

jpa - 在 OSGi 环境中,类路径和类加载器是如何设置的?

我对 OSGi 中的类可见性感到困惑。我正在运行 Apache Felix 并加载以下包:

  • 来自 eclipselink的antlr, asm,jpa和bundlescore
  • javax.persistence1.99的 OSGi-fied jar
  • 带有com.mysql.jdbc驱动程序的 OSGi-fied jar
  • 我自己的一个包,其中包含带注释的实体类和一个persistence.xml
  • 我自己的另一个捆绑包Persistence.createEntityManagerFactory(String, Map)

现在,我很困惑的是哪个包必须能够看到 MySQL 驱动程序。我认为这将是创建 EntityManagerFactory 的包,但是当我在该清单中导入时出现 ClassNotFound 错误。接下来,我尝试从 eclipselinkjpa包的清单中导入它,但又出错了。只有当我从包含持久性单元(实体类和)的包的清单中导入它时persistence.xml,它才能工作。

所以,似乎数据库驱动程序是由类加载器查找 PU 包的,但这对我来说没有意义。这是怎么回事?

我似乎无法为此找到一个简单的文档。这些幻灯片提供了一些提示,但并不十分全面。

0 投票
2 回答
3195 浏览

java - Java 类加载器如何在“常规”情况下工作(类加载器的非显式使用)

我正在研究类路径的动态修改。我找到了一种效果很好的解决方案,但它使用显式调用 addURL() 来实现。(大概在启动时)

但是,如果默认类加载器似乎无法找到类,我想在运行时拦截类加载过程以定位类。我尝试将ClassLoader子类化,因此它只是委托findClass()和默认值,并打印出一条调试行,告诉我这些方法已被调用,但是当我的类通过隐式loadClass()类加载使用依赖类时,它们似乎从未被调用,例如

在这些情况下类加载如何工作?(与显式调用 Classloader.loadClass() 的更简单情况相比)

下面是我对自定义类加载器的尝试。如果我使用带有参数列表的 DynClassLoader0.main(){"some.package.SomeClass", "foo", "bar", "baz"}和 some.package.SomeClass 引用在外部 .jar 文件中找到的其他类,使用上面列出的方法之一,为什么我的 DynClassLoader0 的 findClass() 和 loadClass( ) 被调用?唯一一次调用 loadClass 是在下面的 main() 函数中显式调用 loadClass。

编辑:我已经查看了这些问题:

编辑:我认为 kdgregory 在下面所说的是正确的,一旦我明确使用我的类加载器(参见代码中的行[***]作为注释),从该类执行的所有代码都将导致来自同一个类加载器的隐式类加载。然而,我的 DynClassLoader0.loadClass() 永远不会被调用,除非在最外层的显式调用期间。

0 投票
2 回答
558 浏览

apache-flex - 来自 getDefinitionByName 的奇怪行为

我创建了一个类,它根据传递给它的名称加载它的子类。该函数使用 getDefinitionByName,获取类类型并将其实例化,如果该类是拥有此方法的类的子类型,则返回它。子类型都是扩展基类的 mxml 文件,以简化实例化控件。

但是,在我向它传递一个完全限定名称的情况下,它在我的单元测试中有效,但在我的应用程序上下文中执行它时会失败。getDefinitionByName 中是否有一个陷阱,使它在不同的执行上下文中表现不同?有没有更简单的方法来通过它们的限定名称加载类?

0 投票
3 回答
3485 浏览

java - 如何获取类路径上的包和/或类的列表?

在 Java 中,我可以使用 ClassLoader 来获取已加载的类的列表以及这些类的包。但是我如何获得可以加载的类列表,即在类路径上?与包裹相同。

这是针对编译器的;在解析 foo.bar.Baz 时,我想知道 foo 是否是一个包以将其与其他任何内容区分开来。