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());
}
}