标签: classloader

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

我遇到了一个问题,其中instanceof工作,然后它没有.进入细节很困难,但我认为这可能是问题所在:

阅读本文:http://www.theserverside.com/news/thread.tss? thread_id = 40229(搜索Thread.currentThread),似乎暗示即使两个对象是同一个类,如果你传递它们在具有不同类加载器的线程之间,instanceof(和isAssignableFrom)可能仍会失败.

这当然可以解释我的行为,但我想知道是否有人可以验证它?

(我希望在讨论开始时链接的文章仍然可用,但它似乎不是.)

java multithreading instanceof classloader

14
推荐指数
1
解决办法
5731
查看次数

Java EE类加载标准

WebSphere最后是父级,父级是父级.这是否符合Java EE标准?是否所有符合Java EE 5的应用程序服务器都支持此功能?

architecture classloader java-ee

14
推荐指数
1
解决办法
6922
查看次数

从.war文件加载类的顺序

我有一个关于保证的问题,如果有的话,在下面的场景中(请注意问题不是"如何以不同的方式做到这一点?"),问题实际上是关于以下情况下的类加载顺序(至更好地理解类加载的工作原理).

这是假设的场景......有一个.war文件,它具有以下(部分)目录结构:

 WEB-INF/classes/com/acme/Bunny.class
 .
 .
 .
 WEB-INF/lib/acme.jar
Run Code Online (Sandbox Code Playgroud)

两个Bunny.class文件都有导入引用acme.jar中的其他类

Bunny.classWEB-INF /班/ ...是具有相同的名称/路径,一个类从唯一的类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之前进行类加载?

java web-applications classloader

14
推荐指数
3
解决办法
2万
查看次数

为什么jvm有很多clasloaders?为什么不一个?

我正在学习ClassLoaderJava,然后我想知道,为什么JVM有很多类加载器,为什么不只有一个?首先加载<Java_Runtime_Home>/lib,然后加载<Java_Runtime_Home>/lib/ext,最后加载classpath.

如果你有自定义类加载器,那么系统是第一个.

有人可以告诉我为什么JVM有很多类加载器?

java jvm classloader

14
推荐指数
3
解决办法
5080
查看次数

Singleton类有几个不同的类加载器

例如,我有Singleton静态字段的类instance:

public class Singleton {

    private static Singleton instance;

    // other code, construct, getters, no matter    
}
Run Code Online (Sandbox Code Playgroud)

我可以用两个不同的类加载器加载这个类两次.我怎么能避免它?这是不安全和危险的.

另外,如果我将实例设置为null,它是否会为两个类设置为null?

Singleton singleton = Singleton.getInstance();
singleton = null;
Run Code Online (Sandbox Code Playgroud)

java singleton classloader

14
推荐指数
1
解决办法
2万
查看次数

为什么ClassLoader的缓存按升序检查?

为什么ClassLoader的缓存按递增顺序检查,而类加载以降序排列? 类装载机授权计划

java classloader

14
推荐指数
1
解决办法
905
查看次数

修补或覆盖核心Java 10类的实现

JFX中存在一个错误,通常在计算屏幕坐标时显示出来 https://bugs.openjdk.java.net/browse/JDK-8194727https://bugs.openjdk.java.net/browse/JDK-8190400

我已将问题跟踪到GeneralTransform3D的实现,这是javajfx运行时的一部分.

我已经向Oracle提交了一个错误报告,但在它被接受,修复并进入发布之前,我需要一种修复我的应用程序的方法.

在java 8中,我能够创建一个包含该类的固定版本的jar并将其安装在lib/ext文件夹中.这似乎有效,JFX实现使用了我自己的impl.

在java 10中,已删除扩展机制.将补丁jar添加到类路径不起作用,因为在类加载过程中为时已晚.

有没有办法在Java 10中覆盖/修补核心java类的实现?

请注意,我没有直接使用此类,它由框架使用

java classloader java-10

14
推荐指数
1
解决办法
407
查看次数

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

在Tomcat 5.5服务器上,我在系统类路径中放了一个类(并修改catalina.bat来选择它),或者如果我将类放在共享的lib目录中.现在,如果我有两个不同的应用程序使用相同的类,它们的WEB-INF lib/classes目录中没有该类,则它们使用该类的相同实例.我理解一个类加载器将委托给它的父类加载器的概念,如果它找不到它,那么在这种情况下,因为该类不存在于WEB-INF/classes或WEB-INF/lib中WebAppX类加载器将分别尝试共享,公共和系统类加载器.

然而,这对我来说似乎很奇怪,两个不同的应用程序可以使用此方法共享上下文.有人可以帮我理解为什么会这样.例如,在下面的代码中,当共享CommonCounter时,两个servlet分别部署在单独的战争中,并且它们可以读取由另一个增加的计数器值.

编辑 对我而言,两个独立的应用程序可以以这种方式共享上下文.实际上,如果它们具有相同的类实例,它们甚至可以在两个不同的应用程序中实现多线程/同步,这看起来非常违反直觉.

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+" hits");
    }   
}



public class Servlet2 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        CommonCounter.servlet2++;
        System.out.println("Other one had "+CommonCounter.servlet1+" hits");
    }   
}
Run Code Online (Sandbox Code Playgroud)

java tomcat classloader

13
推荐指数
1
解决办法
8309
查看次数

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

我正在尝试使用自定义类加载器来练习自己,我有一些问题.有没有办法表明JVM全局使用我的自定义类加载器?例如,我编写了在Tomcat 6下运行的小应用程序.servlet由容器管理,我应该在哪里设置我的类加载器?另外,webapp使用了一些第三方罐子,我可以控制这些罐子的类加载吗?

在独立应用程序的情况下,上述答案是否会有所不同?

谢谢!

java tomcat classloader

13
推荐指数
1
解决办法
2万
查看次数

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

我之前遇到过一些我在Java中没有遇到过的东西,也就是说,我需要在运行时创建一个新的ArrayList类实例而不分配已知类型然后将数据添加到列表中.这听起来有点模糊,所以这是一个例子:

Class<?> c = i.getClass();

Constructor<?> con = ArrayList.class.getConstructor();
ArrayList<?> al = (ArrayList<?>)con.newInstance();

al.add("something");
Run Code Online (Sandbox Code Playgroud)

现在我这样做而不仅仅使用泛型的原因是因为泛型已经被大量使用而且这个例子中的"i"变量将被用作类型"?".我真的不想投入另一个通用,因为这会给用户带来更多的工作,并且在最终设计中会更不灵活.有没有办法使用下面的东西(注意:下面的内容不起作用).有人有想法吗?

ArrayList<c> al = (ArrayList<c>)con.newInstance();
Run Code Online (Sandbox Code Playgroud)

java generics reflection classloader

13
推荐指数
3
解决办法
3万
查看次数