【问题标题】:what class loader is used?使用什么类加载器?
【发布时间】:2012-07-25 21:19:46
【问题描述】:

我有几个关于类加载器的问题。

Class.forName("class.name");

....
NotYetLoadedClass cls = new NotYetLoadedClass();
.....

在每种情况下将使用哪些类加载器?对于第一种情况,我假设类加载器用于加载执行方法代码的类。在第二种情况下,我假设线程上下文类加载器。

如果我错了,请稍作解释。

【问题讨论】:

标签: java classloader contextclassloader


【解决方案1】:

两者都使用当前的ClassLoader。正如 DNA 正确指出的那样,http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName%28java.lang.String%29 声明Class.forName() 使用当前的类加载器。一个小实验表明,使用new 语句为实例化加载的类也使用当前的ClassLoader

public class Test
{
    public static void main(String[] args) throws Exception
    {
        Thread.currentThread().setContextClassLoader(new MyClassLoader());
        SomeClass someClass = new SomeClass();
        someClass.printClassLoader();
    }

    public static class MyClassLoader extends ClassLoader
    {
        public MyClassLoader()
        {
            super();
        }

        public MyClassLoader(ClassLoader parent)
        {
            super(parent);
        }
    }
}



public class SomeClass
{
    public void printClassLoader()
    {
        System.out.println(this.getClass().getClassLoader());
        System.out.println(Thread.currentThread().getContextClassLoader());
    }
}

Test 中,我们将当前线程的ContextClassLoader 设置为一些自定义的ClassLoader,然后实例化一个SomeClass 类的对象。在SomeClass 中,我们打印出当前线程的ContextClassLoader 和加载该对象类的ClassLoader。结果是

sun.misc.Launcher$AppClassLoader@3326b249
test.Test$MyClassLoader@3d4b7453

表示当前的ClassLoadersun.misc.Launcher.AppClassLoader)用于加载类。

【讨论】:

  • “当前的ClassLoader”是什么意思?
  • @jameshfisher "当前类的定义类加载器"
  • “当前班级”是什么意思?词法范围?
  • “他的“当前类”是其方法正在执行的类。该类由某个 ClassLoader 加载,并且该 ClassLoader 在通过问题中的任一技术加载新类时排在第一位
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2012-07-08
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多