当前位置:  开发笔记 > 编程语言 > 正文

查找从哪里加载java类

如何解决《查找从哪里加载java类》经验,为你挑选了5个好方法。

有谁知道如何以编程方式找出java类加载器实际加载类的位置?

我经常在大型项目上工作,其中类路径变得非常长并且手动搜索不是真正的选项.我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于两个不同位置的类路径中.

那么我怎样才能让类加载器告诉我实际的类文件来自磁盘的哪个位置?

编辑:如果由于版本不匹配(或其他东西),类加载器实际上无法加载类,那么我们是否可以找到它在读取之前尝试读取的文件?



1> Jon Skeet..:

这是一个例子:

package foo;

public class Test
{
    public static void main(String[] args)
    {
        ClassLoader loader = Test.class.getClassLoader();
        System.out.println(loader.getResource("foo/Test.class"));
    }
}

打印出来的:

file:/C:/Users/Jon/Test/foo/Test.class


@meriton:或者,为了生存refactorinsgs:`Test.class.getResource(Test.class.getSimpleName()+".class")`
为了减少冗余类型,还可以使用较短的版本:`Test.class.getResource("Test.class")`,它不重复包名.
`getClassLoader()`有可能返回`null`.有关此方法的扩展,请参见[此处](http://stackoverflow.com/a/19494116/823393).

2> 小智..:

找出加载类的位置(不需要操作源)的另一种方法是使用以下选项启动Java VM: -verbose:class


这非常有效,并且没有使用null ClassLoader处理类的问题
@ries如果不需要以编程方式执行此操作,那么绝对可以这样做,它确实解决了我的问题。但是,OP专门询问了如何以编程方式执行此操作。

3> 小智..:
getClass().getProtectionDomain().getCodeSource().getLocation();


是的,虽然它不能与安装的安全管理器一起使用,也没有所需的权限.

4> Jevgeni Kaba..:

这就是我们使用的:

public static String getClassResource(Class klass) {
  return klass.getClassLoader().getResource(
     klass.getName().replace('.', '/') + ".class").toString();
}

这将取决于ClassLoader实现: getClass().getProtectionDomain().getCodeSource().getLocation()



5> OldCurmudgeo..:

当对象ClassLoader被注册时,Jon的版本失败,null这似乎暗示它是由Boot加载的ClassLoader.

此方法处理该问题:

public static String whereFrom(Object o) {
  if ( o == null ) {
    return null;
  }
  Class c = o.getClass();
  ClassLoader loader = c.getClassLoader();
  if ( loader == null ) {
    // Try the bootstrap classloader - obtained from the ultimate parent of the System Class Loader.
    loader = ClassLoader.getSystemClassLoader();
    while ( loader != null && loader.getParent() != null ) {
      loader = loader.getParent();
    }
  }
  if (loader != null) {
    String name = c.getCanonicalName();
    URL resource = loader.getResource(name.replace(".", "/") + ".class");
    if ( resource != null ) {
      return resource.toString();
    }
  }
  return "Unknown";
}

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有