/**
* this is my class, yadayada. Needs to be subclassed to be useful.
*/
public abstract class MyClass {
...
public static void myMethod() {
// What is the name of the subclass that's using this?
System.out.println("Called from class " + this.getClass().class.getName());
// Doesn't work because there's no "this" in a static method.
}
}
编辑:这就是我想要发生的事情:
public class FooClass extends MyClass {
...
}
FooClass.myMethod(); // I would like this to print "Called from class FooClass"
我完全没有想法。
编辑:对于那些想知道我为什么这样做的人来说,它实际上是一个Android问题。
Android定义了一个名为BroadcastReceiver的类。您将其子类化并在系统中注册子类。发送适当的广播时,系统会创建子类的实例并调用其中一个方法。
我想创建自己的BroadcastReceiver子类,其中包含一个用于注册自身的静态方法。但我也希望它是可子类化的。它看起来像这样:
/**
* My special-purpose BroadcastReceiver. Subclass this to use it.
*/
public class MyClass extends BroadcastReceiver {
public static scheduleAnAlarm(long when) {
// do some class-specific stuff
AlarmManager.scheduleBroadcast(MyClass.class, when);
}
public void onBroadcast() {
System.out.println("You should subclass MyClass for it to be useful");
}
}
我的问题是我想注册要实例化的子类,而不是MyClass。
答案 0 :(得分:5)
你做不到。那就是你无法从class
方法获得子类的static
。
当Java在类上调用static
方法(即使是abstract
的方法)时,不需要子类,因此类加载器不会加载任何子类。因此,没有必要获得任何子类。即使有,也可能有多个子类,所以Java如何决定你想要哪一个?
编辑,即使你的编辑你也无法获得子类。有一个技巧可以用异常来获取调用类。您可以抛出/捕获异常,然后沿着堆栈跟踪向下走一级以获取调用方法/类。不推荐!
答案 1 :(得分:0)
我想你想要类名,那么下面的内容可能会起作用:
System.out.println("Called from class " + MyClass.class.getName());
答案 2 :(得分:0)
this
在静态上下文中不起作用,您可以访问的类实例MyClass.class
答案 3 :(得分:0)
MyClass.class.getName()怎么样?
答案 4 :(得分:0)
public class Foo extends MyClass{
public static void main(String[] args) {
myMethod();
}
}
和
public abstract class MyClass{
public static void myMethod() {
System.out.println("Called from class " + MyClass.class.getName());
}
}