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

4

5 回答 5

6

你不能。也就是说,您无法class从方法中获取子类的static

当 Java 调用一个static类(甚至是abstract)上的方法时,不需要子类,因此类加载器不会加载任何子类。因此,不一定要获得任何子类。即使有,也可能有多个子类,那么 Java 怎么决定你想要哪一个呢?

编辑,即使您进行了编辑,您也无法获得子类。您可以使用一个技巧来获取调用类。您可以抛出/捕获异常,然后沿着堆栈跟踪一层来获取调用方法/类。不建议!

于 2012-10-26T15:58:43.220 回答
0

我猜你想要类名,那么下面的东西可能会起作用:

 System.out.println("Called from class " + MyClass.class.getName());
于 2012-10-26T15:58:26.340 回答
0

this将无法在静态上下文中工作您可以访问的类实例是MyClass.class

于 2012-10-26T15:58:36.350 回答
0

MyClass.class.getName() 怎么样?

于 2012-10-26T15:59:29.700 回答
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());

    }
}
于 2012-10-26T16:08:04.680 回答