在静态上下文中,为什么不能调用静态版本getClass()(而不是必须使用my.package.name.MyClassName.class)?
是不是编译器足够智能,以确定何时使用对象方法+何时使用静态方法?
注意清楚:
我不是说,一个static getClass()应该使用替代的非静态方法getClass()(这是一种明显的-如果SpecialFoo是的子类Foo,那么getClass()一个Foo可以返回Foo.class或SpecialFoo.class或别的东西,它有在运行时确定).
我说我想知道为什么不存在两个版本getClass(),一个是静态方法,只适用于静态上下文,以及常规的非静态方法getClass().如果不可能,那就不可能了,那就是答案.如果它可能但是还没有完成,那么这是一个历史选择,也许这是一个很好的理由.这就是我想知道的.
宣布这将是伟大的
final static Logger logger = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)
代替
final static Logger logger = LoggerFactory.getLogger(my.package.name.MyClass.class);
Run Code Online (Sandbox Code Playgroud)
前者可以从一个类逐字复制到下一个类,而后者则要求您在每个文件中复制类名.
ale*_*ail 26
你可以用这个成语
Class<?> cl=new Object(){}.getClass().getEnclosingClass();
Run Code Online (Sandbox Code Playgroud)
例如:
static class Bar {
public static void main(String[] args) {
Class<?> cl=new Object(){}.getClass().getEnclosingClass();
System.out.println(cl==Bar.class); //will print true
}
}
Run Code Online (Sandbox Code Playgroud)
每个对象都是Java中的类的实例,没有类可以是另一个类的实例!这就是为什么getClass()不是静态的,因为它只在对象的上下文中有意义:你试图找到一个对象是什么类的实例.如果它是一个静态函数,它可以在一个对象外部调用 - 但它没有意义
String.getClass()
Run Code Online (Sandbox Code Playgroud)
因为你已经知道你在"问"String类!
getClass()提供了与静态.class不同的功能.它用于获取调用它的实例的运行时类.
Object o = new String();
o.getClass() // returns Class<String>
Object.class // returns Class<Object>
Run Code Online (Sandbox Code Playgroud)
如果没有别的,因为同时拥有方法的版本static和非版本是不合法的(可能是因为如果不鼓励的话,在非上下文中static调用方法是合法的)。staticstatic
我也觉得这样的方法虽然在定义记录器或其他上下文中很有用,但在其他上下文中可能会令人困惑,例如从实例方法调用时。
| 归档时间: |
|
| 查看次数: |
18204 次 |
| 最近记录: |