在子类构造函数中调用getClass()总是安全的吗?

Pac*_*ier 16 java constructor class classloader jls

关于类加载的文章指出getClass()不应该在构造函数中调用该方法,因为:

对象初始化仅在构造函数代码的出口处完成.

他们给出的例子是:

public class MyClassLoader extends ClassLoader{
    public MyClassLoader(){
        super(getClass().getClassLoader()); // should not call getClass() because object
                                            //    initialization will be complete only at
                                            //    the exit of the constructor code.
    }
}
Run Code Online (Sandbox Code Playgroud)

但是据我所知,本机final方法getClass()将始终返回该java.lang.Class对象实例的对象,无论它在何处被调用(在构造函数内或不在构造函数内).

将调用getClass()构造函数中曾经给我们带来的问题?

如果是这样,getClass()在构造函数中调用会给我们带来错误的一些例子是什么?

vax*_*uis 10

在构造函数中调用getClass()会给我们带来问题吗?如果是这样,在构造函数中调用getClass()会给我们带来错误的一些例子是什么?

getClass()以这种方式在构造函数中使用将始终导致编译错误,因为在调用this之前无法引用super().

Main.java:17: error: cannot reference this before supertype constructor has been called
        super(getClass().getClassLoader()); // should not call getClass() because object
              ^
1 error
Run Code Online (Sandbox Code Playgroud)

您可以在http://ideone.com/B0nYZ1自行测试.

Class准备好了,但例如不能用于引用Class呢.

仍然,您可以Class在构造函数中使用引用,但您必须以稍微不同的方式执行此操作:super(MyClassLoader.class.getClassLoader())

此外,在调用超类型构造getClass()函数,您可以在构造函数中自由使用- 正如您已经指出的那样,该对象基本上已准备就绪,并且Class可以从实例推断出引用.

  • JAD的@Pacerier反汇编代码显示:`//由Jad v1.5.8g反编译.版权所有2001 Pavel Kouznetsov.// Jad主页:http://www.kpdus.com/jad.html //反编译器选项:packimports(3)//源文件名:MyClassLoader.java public class MyClassLoader扩展ClassLoader {public MyClassLoader(){throw new错误("未解决的编译问题:\n\t无法在显式调用构造函数时引用实例方法\n"); ` - 另外,错误消息在.class文件中以纯文本显示; (3认同)