Tag: 类加载器

如何使用Java ClassLoader从类路径加载文件?

我想使用ClassLoader加载Properties类的属性文件。 为了本次讨论的目的,我简化了以下代码以删除error handling: loader = this.getClass().getClassLoader(); in = loader.getResourceAsStream(“theta.properties”); result = new Properties(); result.load(in); 在与此类相同的目录中,我有文件“theta.properties”,但InputStream始终为null。 我把文件放在错误的地方吗? 我正在使用eclipse及其设置将类文件构建到源文件夹 – 所以这应该不是问题。 我在JavaDoc中找不到任何东西让ClassLoader告诉我正在搜索什么类路径。

具有多个应用程序的Tomcat上的类加载器行为

在Tomcat 5.5服务器上,我在系统类路径中放了一个类(并修改catalina.bat来选择它),或者如果我将类放在共享的lib目录中。 现在,如果我有两个不同的应用程序使用相同的类,它们的WEB-INF lib / classes目录中没有该类,则它们使用该类的相同实例。 我理解一个类加载器将委托给它的父类加载器的概念,如果它找不到它,那么在这种情况下,由于该类不存在于WEB-INF / classes或WEB-INF / lib中WebAppX类加载器将分别尝试共享,通用和系统类加载器。 然而,这对我来说似乎很奇怪,两个不同的应用程序可以使用此方法共享上下文。 有人能帮助我理解为什么会这样。 例如,在下面的代码中,当共享CommonCounter时,两个servlet分别部署在单独的战争中,并且它们可以读取由另一个增加的计数器值。 编辑 对我而言,两个独立的应用程序可以以这种方式共享上下文。 实际上,如果它们具有相同的类实例,它们甚至可以跨两个不同的应用程序实现multithreading/同步,这看起来非常违反直觉。 package com.test; public class CommonCounter { public static int servlet1; public static int servlet2; } public class Servlet1 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { CommonCounter.servlet1++; System.out.println(“Other one had “+CommonCounter.servlet2+” […]

在Threads之间传递对象时是否可以使用instanceof?

我遇到了一个问题,其中instanceof工作,然后它没有。 进入细节很困难,但我认为这可能是问题所在: 阅读本文: http : //www.theserverside.com/news/thread.tss? thread_id = 40229(搜索Thread.currentThread),似乎暗示即使两个对象是同一个类,如果你传递它们在具有不同类加载器的线程之间,instanceof(和isAssignableFrom)可能仍会失败。 这当然可以解释我的行为,但我想知道是否有人可以validation它? (我希望在讨论开始时链接的文章仍然可用,但它似乎不是。)

Jar hell:如何在运行时使用类加载器将一个jar库版本替换为另一个jar库版本

我还是比较新的Java,所以请耐心等待。 我的问题是我的Java应用程序依赖于两个库。 让我们称它们为库1和库2.这两个库共享对库3的相互依赖。但是: 库1完全需要库3的版本1。 库2完全要求库3的版本2。 这正是JAR地狱的定义(或者至少是其中的一个变体)。 如链接中所述,我无法在同一个类加载器中加载第三个库的两个版本。 因此,我一直试图弄清楚是否可以在应用程序中创建一个新的类加载器来解决这个问题。 我一直在研究URLClassLoader ,但我无法弄明白。 这是一个演示问题的示例应用程序结构。 应用程序的Main类(Main.java)尝试实例化Library1和Library2,并运行在这些库中定义的一些方法: Main.java(原始版本,在尝试解决方案之前): public class Main { public static void main(String[] args) { Library1 lib1 = new Library1(); lib1.foo(); Library2 lib2 = new Library2(); lib2.bar(); } } Library1和Library2都共享对Library3的相互依赖,但是Library1只需要版本1,而Library2只需要版本2.在这个例子中,这两个库只打印他们看到的Library3版本: Library1.java: public class Library1 { public void foo() { Library3 lib3 = new Library3(); lib3.printVersion(); // Should […]

以编程方式分析jar文件

我需要以编程方式计算给定jar文件中编译的类,接口和枚举的数量(所以我需要三个单独的数字)。 哪种API对我有帮助? (我不能使用第三方库。) 我已经尝试了相当棘手的方案,似乎并不总是正确的。 也就是说,我将每个ZipEntry读入一个byte [],然后将结果提供给我的自定义类加载器,它扩展了标准的CalssLoader,并将此byte []发送到ClassLoader.defineClass(这是保护,无法直接从应用程序代码调用) )。 完整代码在Pastebin上 。

getResourceAsStream在新环境下失败了吗?

你好, 我有以下代码行: InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream(“/com/thinkplexx/lang/de/general.xml”); 我知道带有com / thinkplexx / lang / de / general.xml的jar在classpath中。 它在“以前的环境”下运行,这是maven2 build。 现在,我评估maven3,它不起作用! 我知道,如果我将代码更改为: InputStream passoloExportFileInputStream = getClass().getClassLoader().getResourceAsStream(“com/thinkplexx/lang/de/general.xml”); 它工作得很好(我刚从资源路径中删除了第一个斜杠)。 顺便说一句,我用的是Linux。 路径中的第一个斜杠通常意味着“从根目录”,所以如果这个逻辑对于java资源加载也是合理的,那么第一个例子应该永远不会有效! 问题:第一个代码示例有问题,即使用/ com /而不是com / ? 这只是糟糕的代码还是意味着不同的东西? 谢谢!

Java:如何加载已经在类路径上的类(及其内部类)?

如何加载已经在类路径上的类,实例化它,并实例化其中定义的任何内部类? 例如: public class TestClass { public class InnerClass { } }

ClassLoader.defineClass抛出的ClassCircularityError

我正在使用自定义类加载器加载类。 在大多数情况下,一切正常,但有时当我加载特别复杂的项目/库时,我得到一个奇怪的错误: Exception in thread “main” java.lang.ClassCircularityError: org/apache/commons/codec/binary/Hex at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.lang.ClassLoader.defineClass(ClassLoader.java:466) at my.custom.class.Loader.loadClass(…) 看看Javadocs,我不希望defineClass抛出这个特殊的错误。 org/apache/commons/codec/binary/Hex是我正在尝试加载的类。 这几乎就像defineClass在定义类之前想要一个类的副本 – 这对我来说没有意义。 想法?

在运行时替换某些方法的内容

我想在运行时替换一些方法的内容。 我知道我可以使用javassist ,但它不起作用,因为我想要增强的类已经被系统classLoader加载。 我该怎么做,在运行时替换方法的内容? 我应该尝试卸载课程吗? 我怎样才能做到这一点 ? 我看到它是可能的,但我无法弄清楚如何做到这一点。 如果可能的话,我想避免使用外部库,我想自己编写代码。 更多信息: – 我想要增强的类包含在一个框架中(在一个jar文件中) – 我的代码实际上是这个框架的一个插件 – 我的插件运行的框架有自己的classLoader ,但是这个classLoader没有加载自己的类(它将它们委托给系统类加载器) – 我正在使用的框架是Play 。 谢谢您的帮助 !

如何在我的java项目中使用两个版本的jar

在我的java项目中,我需要使用依赖于lucene-3.6.2的 neo4j-1.9.3和依赖于lucene-4.4.0的 ElasticSearch 。 我知道如果我想直接使用两个版本的lucene,我可以使用ClassLoader从lucenes加载不同的类。 但问题是我现在不会直接使用lucene的apis。 有什么办法可以在neo4j的apis运行时加载lucene-3.6.2,并且可以在运行elasticsearch的apis时加载lucene-4.4.0。 lucene的两个版本现在发生冲突,我需要在一个项目中运行neo4j和elasticsearch。 我怎么能解决依赖问题? 提前致谢。