如何从子类的静态方法获取类?

时间:2012-10-26 15:54:58

标签: java

/**
 * 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。

5 个答案:

答案 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());

    }
}