标签: classloader

Java Enums:两个枚举类型,每个类型包含对彼此的引用?

有没有办法解决因两个相互引用的枚举导致的类加载问题?

我有两组枚举,Foo和Bar,定义如下:

public class EnumTest {

  public enum Foo {
    A(Bar.Alpha),
    B(Bar.Delta),
    C(Bar.Alpha);

    private Foo(Bar b) {
      this.b = b;
    }

    public final Bar b;
  }

  public enum Bar {
    Alpha(Foo.A),
    Beta(Foo.C),
    Delta(Foo.C);

    private Bar(Foo f) {
      this.f = f;
    }

    public final Foo f;
  }

  public static void main (String[] args) {
    for (Foo f: Foo.values()) {
      System.out.println(f + " bar " + f.b);
    }
    for (Bar b: Bar.values()) {
      System.out.println(b + " foo " + b.f);
    }
  } …
Run Code Online (Sandbox Code Playgroud)

java oop enums classloader cyclic-reference

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

如何探索从哪些JAR加载哪些类?

有没有办法确定在运行时从哪些jar加载哪些类?

我相信我们以前一直都在JAR地狱.我在项目上遇到了很多故障排除ClassNotFoundException和问题NoClassDefFoundError.我想避免在罐子里找到一个类的所有实例,并在代码上使用消除过程导致CNFE找到罪魁祸首.

是否有任何分析或管理工具可以为您提供此类信息?

这个问题非常烦人,因为我们应该在类加载时获得这些信息.必须有一种方法来达到它,或记录并找到它,但我知道什么都不会做到这一点,对吗?

我知道OSGi和版本化的软件包/模块旨在使这个问题成为一个问题......但它似乎不会很快消失.:)

注意:我发现这个问题是我的问题的一个子集,与从版本化的jar加载的类有关.

更新:有点相关,这篇文章解释了在jar中(在当前目录下)或在M2_REPO中搜索类的策略. JarScan,扫描所有子文件夹中的特定类的所有JAR文件

更新2:JBoss Tattletale也有些相关

java profiling jar classloader

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

java中的sysLoader.getResource()问题

我有以下代码行.

sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader();
url = sysLoader.getResource("tempFile.txt");
Run Code Online (Sandbox Code Playgroud)

它给出了一个奇怪的问题.如果我从路径中没有空格的路径(文件夹名称)运行它,那么它运行正常.但是如果路径包含任何空格(行"c:\ New Foler ...")那么它就不起作用了.

怎么解决这个?

编辑:更详细 - 我检查了sysloader对象.

sysloader - > UCP - > path

是否有一个字符%20而不是空格的路径

因此,所有URL都为空.

怎么解决这个?

java url classloader

30
推荐指数
2
解决办法
9775
查看次数

如何使用自定义ClassLoader?

大家好,感谢您的关注!我有一个既容易又明显的问题,但我被卡住了.

我想通过自定义ClassLoader提供动态创建的Java类,供第三方库使用.

现在我的问题是:当我不自己直接加载这些类时,如何设置我的自定义ClassLoader来加载这些类?

我想当我使用我的ClassLoader加载某个类时,它就变成了这个类的ClassLoader,并且从该类加载的所有类都将通过我的ClassLoader引导.

我按照这个官方教程创建了一个自定义的ClassLoader:http://java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/ClassLoader/help.html.

public class DynamicClassloader extends ClassLoader {

    private Map<String, Class<?>> classesMap = new HashMap<String, Class<?>>();

    public DynamicClassloader(ClassLoader parent) {
        // Also tried super(parent);
        super(sun.misc.Launcher.getLauncher().getClassLoader());
    }

    // Adding dynamically created classes
    public void defineClass(String name, Class<?> clazz) {
        classesMap.put(name, clazz);
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // load from parent
        Class<?> result = findLoadedClass(name);
        if (result != null) {
            return result;
        }
        try {
            result = findSystemClass(name);
        } catch (Exception …
Run Code Online (Sandbox Code Playgroud)

java classloader

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

静态引用被清除 - 如果未使用,Android会在运行时卸载类吗?

我有一个特定的问题,如何在Android中运行类加载/垃圾收集.我们现在偶然发现了几次这个问题,据我所知,Android在这里与普通的JVM不同.

问题在于:我们目前正在尝试减少应用程序中的单例类,以支持单个根工厂单例,其唯一目的是管理其他管理器类.如果你愿意的话,是一名顶级经理.这使我们可以轻松地替换测试中的实现,而无需选择完整的DI解决方案,因为所有活动和服务共享对该根工厂的相同引用.

这是它的样子:

public class RootFactory {

    private static volatile RootFactory instance;

    @SuppressWarnings("unused")
    private Context context; // I'd like to keep this for now

    private volatile LanguageSupport languageSupport;
    private volatile Preferences preferences;
    private volatile LoginManager loginManager;
    private volatile TaskManager taskManager;
    private volatile PositionProvider positionManager;
    private volatile SimpleDataStorage simpleDataStorage;

    public static RootFactory initialize(Context context) {
        instance = new RootFactory(context);
        return instance;
    }

    private RootFactory(Context context) {
        this.context = context;
    }

    public static RootFactory getInstance() {
        return instance;
    }

    public LanguageSupport getLanguageSupport() …
Run Code Online (Sandbox Code Playgroud)

java singleton android garbage-collection classloader

29
推荐指数
2
解决办法
5948
查看次数

ClassLoader getResourceAsStream返回null

我的项目目录结构(在Eclipse中):

MyProject/
    src/        --> "source directory" on Eclipse's classpath/buildpath
        com.me.myapp
            Driver
            myconfig.txt
Run Code Online (Sandbox Code Playgroud)

Driver,我有以下代码:

public class Driver {
    public static void main(String[] args) {
        InputStream is = ClassLoader.getSystemClassLoader.getResourceAsStream("myconfig.txt");
        if(is == null)
            System.out.println("input stream is null");
        else
            System.out.println("input stream is NOT null :-)");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到以下控制台输出:

input stream is null
Run Code Online (Sandbox Code Playgroud)

为什么?我是否放置myconfig.txt在错误的位置?我是否错误地使用了ClassLoader API?别的什么?提前致谢!

java eclipse inputstream classpath classloader

29
推荐指数
2
解决办法
6万
查看次数

想要并行运行非线程安全库 - 可以使用多个类加载器来完成吗?

我正在开发一个项目,在这个项目中,我们使用的库不能保证线程安全(并且不是),并且在Java 8流场景中是单线程的,它可以按预期工作.

我们希望使用并行流来获得低悬挂可扩展性的成果.

不幸的是,这导致库失败 - 很可能是因为一个实例干扰了与另一个实例共享的变量 - 因此我们需要隔离.

我正在考虑为每个实例(可能是本地线程)使用单独的类加载器,据我所知,这应该意味着,出于所有实际目的,我需要隔离,但我不熟悉为此目的故意构建类加载器.

这是正确的方法吗?为了获得适当的生产质量,我该如何做?


编辑:我被要求提供有关触发问题的情况的其他信息,以便更好地理解它.问题仍然是关于一般情况,而不是修复图书馆.

我可以完全控制库创建的对象(https://github.com/veraPDF/)

<dependency>
    <groupId>org.verapdf</groupId>
    <artifactId>validation-model</artifactId>
    <version>1.1.6</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

使用项目maven存储库来存在工件.

<repositories>
    <repository>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <id>vera-dev</id>
        <name>Vera development</name>
        <url>http://artifactory.openpreservation.org/artifactory/vera-dev</url>
    </repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)

目前,强化图书馆是不可行的.


编辑:我被要求显示代码.我们的核心适配器大致是:

public class VeraPDFValidator implements Function<InputStream, byte[]> {
    private String flavorId;
    private Boolean prettyXml;

    public VeraPDFValidator(String flavorId, Boolean prettyXml) {
        this.flavorId = flavorId;
        this.prettyXml = prettyXml;
        VeraGreenfieldFoundryProvider.initialise();
    }

    @Override
    public byte[] apply(InputStream inputStream) {
        try {
            return apply0(inputStream);
        } catch (RuntimeException e) {
            throw e;
        } catch (ModelParsingException …
Run Code Online (Sandbox Code Playgroud)

java multithreading classloader

28
推荐指数
3
解决办法
2117
查看次数

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

我刚刚解决了另一个*我 - 虽然 - 我正在使用这个版本的库 - 但显然是我的应用程序服务器 - 已经加载了一个旧版本的-this-library-*issue(叹气).

有没有人知道验证(或监控)您的应用程序是否可以访问所有相应的jar文件或加载的类版本的好方法?

提前致谢!

[PS 在我的视图中开始使用OSGi模块架构的一个很好的理由!]

更新:这篇文章也有帮助!通过将JBoss的类加载器写入日志文件,它让我了解了JBoss的类加载器.

java jar classloader

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

什么加载java系统类加载器?

我们知道我们可以用以下方式覆盖System 类加载器:

java -Djava.system.class.loader=com.test.MyClassLoader xxx
Run Code Online (Sandbox Code Playgroud)

那么,因为com.test.MyClassLoader它本身就是一个类,它是由谁加载的?

我们如何获得这个"meta"类加载器的类文件?

java classloader

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

在运行时更新JAR

如果jar在JVM中运行,则可以卸载当前运行的Jar并将其从系统中删除.下载新版本并使用与最后一个Jar相同的名称重命名,然后初始化新Jar,在JVM中创建Jar的无缝更新.甚至可以指示JVM执行此操作吗?甚至可以在运行时更新Jar吗?

java jvm classpath classloader

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