繁体   English   中英

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

[英]How do I get the class from a static method of a subclass?

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

你不能 那就是您不能从static方法获得子class的类。

当Java在类(甚至是abstract类)上调用static方法时,则不需要子类,因此类加载器不会加载任何子类。 因此,不一定要获取任何子类。 即使存在,也可能有多个子类,所以Java如何确定所需的子类?

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

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

 System.out.println("Called from class " + MyClass.class.getName());

this将无法在静态上下文中工作,您可以访问的类实例是MyClass.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());

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM