Is it always safe to call getClass() within the subclass constructor?(转)

 


14down votefavorite

 

An article on classloading states that the method getClass() should not be called within a constructor because:

object initialization will be complete only at the exit of the constructor code.

The example they gave was:

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.
    }
}

However from what I know, the native final method getClass() will always return the java.lang.Class object of that object instance, regardless of where it's called (within the constructor or not).

Will calling getClass() within the constructor ever give us problems?

If so, what are some examples whereby calling getClass() within the constructor would give us errors?

java class constructor classloader jls


shareimprove this question

edited Aug 29 '14 at 7:13

 

 

asked Aug 29 '14 at 4:49

Pacerier
23.5k26120225

 
add a comment

3 Answers

activeoldestvotes


up vote7down voteaccepted

Will calling getClass() within the constructor ever give us problems? If so, what are some examples whereby calling getClass() within the constructor would give us errors?

Using getClass() in constructor in this manner will always result in a compilation error, since thiscannot be referenced before super() has been called.

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

You can test it yourself on http://ideone.com/B0nYZ1.

The Class is ready, but the instance can't be used to reference the Class yet.

Still, you can use the Class reference in constructor, but you have to do it in a slightly different way: super(MyClassLoader.class.getClassLoader())

Also, you are free to use getClass() in your constructor after the supertype constructor has been called - as you already pointed out, the object is basically ready after that and the Class reference can be inferred from the instance.

http://stackoverflow.com/questions/25561873/is-it-always-safe-to-call-getclass-within-the-subclass-constructor

时间: 2024-09-12 15:51:41

Is it always safe to call getClass() within the subclass constructor?(转)的相关文章

java反射技术(一)

java的反射技术功能十分强大,整理一些资料!! (如需转载,请注明出处!) Lesson: 检测类examing class 1.Retrieving Class Objects 获取一个Class对象(metadata) a,从对象的实例获取.Class c = mystery.getClass();//(return Class)b,从子类的实例获取TextField t = new TextField(); Class c = t.getClass(); Class s = c.getS

Microsoft Visual C++ and Win32 structured exception handling

Introduction In an earlier article [1] I described some performance measurements when using exceptions in various languages on Windows. A couple of people since then have asked me questions about how the windows exception model actually works and how

思科SAFE蓝图中科院海洋安全解决方案

就在5年前,黑客和病毒还是新鲜词.如果什么地方被黑客攻击,或者出现什么新的病毒,肯定会成为热炒的新闻.可现在,黑客和病毒好象就在我们身边,随时都有爆发的可能.网络安全成了我们每个人心中的隐患,中科院海洋所现在就面临着这样的问题. 中科院海洋研究所成立于1950年,是我国目前规模最大.综合实力最强的海洋科学研究机构,他们在海洋生物.海洋生态.海洋地质等很多领域做了大量的开创性和奠基性的工作.和科研领域的许多研究所一样,海洋所每天都要进行大量的内外信息交流,这些交流主要在网络上进行.在前些年,网络安

php vc6 vc9:PHP版本VC6与VC9、Thread Safe与None-Thread Safe等的区别

最近发现很多PHP程序员对PHP版本知识了解不是很清楚,自己也看了不少类似的文章,还是感觉不够明确和全面,网上的结论又都是模棱两可,在此,给出最完整甚至武断的解释.本文讲解:VC6与VC9,Thread Safety与None-Thread Safe,Apache module与fastcgi的区别与选择.PHP的大版本主要分三支:PHP4/PHP5/PHP6其中,PHP4由于太古老.对OO支持不力已基本被淘汰,请无视PHP4.PHP6由于基本没有生产线上的应用,还基本只是一款概念产品,很多功能

PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析

一共给了四个版本,VC9 x86 Non Thread Safe.VC9 x86 Thread Safe.VC6 x86 Non Thread Safe.VC6 x86 Thread Safe,这让我这个菜鸟头疼啊,还好 PHP 官网提供下载的地方左边有个英文 choose 我看懂了,我估摸着就是如何来选择版本的意思吧,于是开始查字典及上网查找,终于看明白了具体意思,拿来做个备忘先. 一.如何选择 PHP5.3 的 VC9 版本和 VC6 版本 VC6 版本是使用 Visual Studio 6

Is your .NET Code safe?

Is Your Code Safe? VS.NET's use of Microsoft Intermediate Language creates big advantages, but exposes VB.NET on the desktop. by Dan FergusURL: http://www.vbpj.com/upload/free/features/vbpj/2001/05may01/df0501/df0501-1.asp In the Visual Studio.NET (V

使用Source Safe for SQL Server解决数据库版本管理问题

简介 在软件开发过程中,版本控制是一个广为人知的概念.因为一个项目可能会需要不同角色人员的参与,通过使用版本控制软件,可以使得项目中不同角色的人并行参与到项目当中.源代码控制使得代码可以存在多个版本,而不会将代码库变得混乱,典型的场景包括Bug修复.添加新功能.版本整合等. 虽然在开发层面的版本控制软件已经非常成熟,但目前国内还没有专门针对数据库层面的版本控制软件来帮助不同角色的人员在数据库层面进行团队协作.变更代码管理以及对数据库的变更进行查看和比对.在数据库层面版本控制工具的缺乏可能会出现如

PHP 5.3的VC9、VC6、Thread Safe、Non Thread Safe有什么区别

PHP一共给了四个版本,VC9 x86 Non Thread Safe.VC9 x86 Thread Safe.VC6 x86 Non Thread Safe.VC6 x86 Thread Safe,这让我这个菜鸟头疼啊,还好 PHP 官网提供下载的地方左边有个英文 choose 我看懂了,我估摸着就是如何来选择版本的意思吧,于是开始查字典及上网查找,终于看明白了具体意思,拿来做个备忘先. 一.如何选择 PHP5.3 的 VC9 版本和 VC6 版本 VC6 版本是使用 Visual Studi

卡巴斯基面向Windows Phone平台推出安全浏览器:Safe Browser

由于市占率不高,因此Windows Phone没有成为恶意软件的头号目标.从某种意义上来说,这也算是给了WP用户一些"安全感".与iOS一样,为了确保系统安全,Windows Phone也限制了用户和应用的权限--这也是该平台没有恶意软件肆虐的原因之一.此外,微软有包括沙箱在内的多种技术手段.只不过,世上没有不透风的墙,而互联网上又潜伏着许多阴暗的角落,令人防不胜防. 为了避免用户遭遇这些威胁,世界知名的安全厂商--卡巴斯基(Kaspersky)--已经面向Windows Phone平