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

Java 如何从子类的静态方法获取类?,java,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("Cal

编辑:这就是我希望发生的事情:

/**
 * 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.
  }
}
我完全没有主意了

编辑:对于那些想知道我为什么要这样做的人来说,这实际上是一个Android的问题

Android定义了一个名为BroadcastReceiver的类。您可以将其子类化,并在系统中注册子类。当发送适当的广播时,系统将创建子类的实例并调用其方法之一

我想创建自己的BroadcastReceiver子类,该子类包含一个用于注册自身的静态方法。但我也希望它是子类的。有点像这样:

public class FooClass extends MyClass {
  ...
}

FooClass.myMethod();   // I would like this to print "Called from class FooClass"

我的问题是,我想注册要实例化的子类,而不是MyClass。

我想您需要类名,那么下面的方法可能会起作用:

/**
 * 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.class

。也就是说,您无法从
静态
方法获取子类的

当Java对类调用
静态
方法(即使是
抽象
)时,不需要子类,因此类加载器不会加载任何子类。因此,不一定要获得任何子类。即使有,也可能有多个子类,所以Java如何决定您想要哪一个子类呢


Edit,即使使用Edit,也无法获得子类。有一个技巧可以用于异常获取调用类。您可以抛出/捕获一个异常,然后沿着堆栈跟踪走一层,以获取调用的方法/类。不推荐

MyClass.class.getName()怎么样


是的,这就是我现在正在做的,但是如果MyClass被子类化,我希望这个方法返回子类,而不是它定义的类。他试图获取未指定子类的
。我认为基本上这里有一些问题,1)静态是特定于类而不是实例的,那么,将此方法编写为静态以获得子类行为是没有意义的。可能您需要重新考虑设计?对于所有这些答案,他试图获得未指定子类的
类。正如我在回答中指出的那样,静态方法是不可能的。请参阅上面的编辑。我创建一个子类,并从中调用该方法。但是,是的,我完全相信类方法很难与定义它们的类绑定。是的,我很害怕。我一直在考虑如何使用反射,但当你开始按照这些思路思考时,是时候开始思考你的整体设计了。
 System.out.println("Called from class " + MyClass.class.getName());
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());

    }
}