Tag: 类加载器

更改类加载器

我正在尝试在运行时切换类加载器: public class Test { public static void main(String[] args) throws Exception { final InjectingClassLoader classLoader = new InjectingClassLoader(); Thread.currentThread().setContextClassLoader(classLoader); Thread thread = new Thread(“test”) { public void run() { System.out.println(“running…”); // approach 1 ClassLoader cl = TestProxy.class.getClassLoader(); try { Class c = classLoader.loadClass(“classloader.TestProxy”); Object o = c.newInstance(); c.getMethod(“test”, new Class[] {}).invoke(o); } catch (Exception […]

创建一个ClassLoader以从字节数组加载JAR文件

我正在寻找一个自定义类加载器,它将从自定义网络加载JAR文件。 最后,我必须使用的是JAR文件的字节数组。 我无法将字节数组转储到文件系统上并使用URLClassLoader 。 我的第一个计划是从流或字节数组创建一个JarFile对象,但它只支持File对象。 我已经写了一些使用JarInputStream东西: public class RemoteClassLoader extends ClassLoader { private final byte[] jarBytes; public RemoteClassLoader(byte[] jarBytes) { this.jarBytes = jarBytes; } @Override public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { Class clazz = findLoadedClass(name); if (clazz == null) { try { InputStream in = getResourceAsStream(name.replace(‘.’, ‘/’) + “.class”); ByteArrayOutputStream out = […]

类加载器问题 – 如何确定加载哪些库版本(jar文件)

我刚刚解决了另一个*我 – 虽然 – 我正在使用这个版本的库 – 但显然是我的应用程序服务器已经加载了一个旧版本的-this-library- * issue(叹气)。 有没有人知道validation(或监控)您的应用程序是否可以访问所有相应的jar文件或加载的类版本的好方法? 提前致谢! [PS在我的视图中开始使用OSGi模块架构的一个很好的理由!] 更新 : 这篇文章也有帮助! 通过将JBoss的类加载器写入日志文件,它让我了解了JBoss的类加载器。

使用自定义类加载器中的javax.tools.ToolProvider?

似乎不可能使用Ant或Webstart所需的自定义类加载器中的javax.tools.ToolProvider : http ://bugs.sun.com/view_bug.do?video_id = 6548428 javax.tools.ToolProvider.getSystemJavaCompiler()将javax.tools.JavaCompiler加载到URLClassLoader中,其父级是系统类加载器。 API似乎不允许用户指定父类加载器。 如何从自定义类加载器中使用javax.tools.JavaCompiler ? 例如: Ant加载MyParserTask MyParserTask解析Java源代码 AntClassLoader由委托给系统类加载器的AntClassLoader加载 javax.tools.JavaCompiler由URLClassLoader加载,代理到系统类加载器 稍后, MyParserTask调用: javax.tools.CompilationTask task = compiler.getTask(…); com.sun.source.util.JavacTask javacTask = (com.sun.source.util.JavacTask) task; javacTask.parse().next().accept(visitor, unused); // parsing happens here 看到这两个类如何驻留在不同的类加载器上, JavacTask没有办法在不获取ClassCastException错误的情况下与JavacTask进行交互。 有任何想法吗?

Java添加到未知类型的通用列表

我之前遇到过一些我在Java中没有遇到过的东西,也就是说,我需要在运行时创建一个新的ArrayList类实例而不分配已知类型然后将数据添加到列表中。 这听起来有点模糊,所以这是一个例子: Class c = i.getClass(); Constructor con = ArrayList.class.getConstructor(); ArrayList al = (ArrayList)con.newInstance(); al.add(“something”); 现在我这样做而不仅仅使用generics的原因是因为generics已经被大量使用而且这个例子中的“i”变量将被用作类型“?”。 我真的不想抛弃另一个generics,因为这会给用户带来更多的工作,并且在最终设计中会更不灵活。 有没有办法使用下面的东西(注意:下面的内容不起作用)。 有人有想法吗? ArrayList al = (ArrayList)con.newInstance();

从.war文件加载类的顺序

在下面的场景中我有一个关于保证的问题(如果有的话)(请注意问题不是“如何以不同的方式执行此操作?”) ,问题实际上是关于以下情况下的类加载顺序(至更好地理解类加载的工作原理)。 这是假设的场景……有一个.war文件,它具有以下(部分)目录结构: WEB-INF/classes/com/acme/Bunny.class . . . WEB-INF/lib/acme.jar 两个Bunny.class文件都有导入引用acme.jar中的其他类 WEB-INF / classes / …中的Bunny.class是唯一一个与acme.jar中的类具有相同名称/路径的类。 .jar文件acme.jar还包含com.acme.Bunny (并且没有使用特殊的类加载器技巧)。 据我所知,Java规范保证在程序实际使用(或故意“手动加载类似”)之前不会加载类,这就是为什么如果你填充数千个.jar,比如说.war,类加载器不会开始加载数万个类。 (编辑) 但是上面示例中的两个类的加载顺序又如何呢? 应该措辞: 但是如何确定上面两个类中的哪一个被加载? 或类似的东西 :) 有一个保证: com.acme.Bunny将在com.acme的任何其他类之前使用…. 基本上,在维基百科上,写了以下内容: 最复杂的JAR地狱问题出现在利用类加载系统的完全复杂性的情况下。 Java程序不需要仅使用单个“平面”类加载器,而是可以由几个(或实际上是不确定数量的)嵌套的协作类加载器组成。 由不同类加载器加载的类可能以复杂的方式进行交互,而开发人员无法完全理解这些类,从而导致无法解释的错误或错误。 所以我想知道:我可以确定/classes/com/acme/Bunny.class是否会在WEB-INF / lib / dir中的.jar之前进行类加载?

如何将我的自定义类加载器设置为默认值?

我正在尝试用自定义类加载器练习自己,我有一些问题。 有没有办法指示JVM全局使用我的自定义类加载器? 例如,我编写了在Tomcat 6下运行的小应用程序.servlet由容器管理,我应该在哪里设置我的类加载器? 另外,webapp使用了一些第三方jar子,我可以控制这些jar子的类加载吗? 对于独立应用程序,上述答案是否会有所不同? 谢谢!

在Eclipse插件中使用时,Reflections库无法正常工作

我使用Reflections库开发了一个应用程序,用于查询具有特定注释的所有类。 在我决定从我的应用程序创建一个Eclipse插件之前,一切都像魅力一样。 然后,思考停止工作。 鉴于我的应用程序在不是Eclipse插件的一部分时工作正常,我认为它应该是一个类加载器问题。 所以我在我的Reflections类中添加了插件激活器类的类加载器,上下文类加载器以及我能想象的所有其他类加载器,没有任何成功。 这是我的代码的简化版本: ConfigurationBuilder config = new ConfigurationBuilder(); config.addClassLoaders(thePluginActivatorClassLoader); config.addClassLoaders(ClasspathHelper.getContextClassLoader()); config.addClassLoaders(“all the classloaders I could imagine”); config.filterInputsBy(new FilterBuilder().include(“package I want to analyze”)); Reflections reflections = new Reflections(config); Set<Class> classes = reflections.getTypesAnnotatedWith(MyAnnotation.class); //this Set is empty 我也尝试将我想加载的类的URL添加到ConfigurationBuilder类,但它没有帮助。 有人能告诉我是否有办法让Reflections作为Eclipse插件的一部分工作?或者我应该更好地寻找另一种替代方案? 非常感谢,我真的很困惑。

使用ClassLoader加载文件

这个问题一直困扰着我。 我必须在我的java应用程序中加载几个文件,到目前为止我工作的唯一方法是这样的: URL hsURL; if(System.getProperty(“os.name”).toLowerCase().contains(“windows”)) { hsURL = new URL(“file:/” + System.getProperty(“user.dir”) + “/helpsets/helpset.hs”); } else { hsURL = new URL(“file://” + System.getProperty(“user.dir”) + “/helpsets/helpset.hs”); } 但这是丑陋可怕的。 有一段时间我以为我有这个工作: hsURL = ClassLoader.getSystemResource(“helpsets/helpset.hs”); 但是由于某些原因它不再起作用(我必须改变一些东西而不是注意到它。它返回null。 我应该使用getResource()而不是getSystemResource()(如果是这样,为什么getSystemResource()是静态的而不是getResource())? 我正在使用eclipse,我尝试在构建路径(classpath)中包含该文件夹而不包括它,它似乎没有什么区别。

我可以在ibm-web-bnd.xmi文件中为WebSphere设置类加载器策略吗?

我有一个在WAS 6上运行的JEE应用程序。它需要将类加载器顺序设置为“首先加载应用程序类加载器的类”,并将WAR类加载器策略选项设置为“应用程序的单个类加载器”。 是否可以在EAR文件中指定这些选项,无论是在ibm-web-bnd.xmi文件还是其他文件中,因此管理员无需手动更改这些设置? 由于应用程序是通过自动脚本部署的,并且负责部署的人员不在现场,而且出于其他一些政治原因,这将有很大帮助!