Java:父类能否静态检索子类的类名?

Java:父类能否静态检索子类的类名?,java,class,inheritance,static,classname,Java,Class,Inheritance,Static,Classname,关于Java,我想静态地知道当前类的类名。A是B的父类。我希望在A(父类)中有一个包含当前类的类名的静态字符串,但是当在B(子类)中引用此静态字符串时,它应该包含B的类名。这可能吗 例如: public class Parent { protected static String MY_CLASS_NAME = ??? . . . } public class Child extends Parent { public void testMethod() { if (MY_CLA

关于Java,我想静态地知道当前类的类名。A是B的父类。我希望在A(父类)中有一个包含当前类的类名的静态字符串,但是当在B(子类)中引用此静态字符串时,它应该包含B的类名。这可能吗

例如:

public class Parent {

protected static String MY_CLASS_NAME = ???
.
.
.
}

public class Child extends Parent {

public void testMethod() {
     if (MY_CLASS_NAME.equals(getClass().getName())) {
        System.out.println("We're equal!");
     }
}

}

不,那是不可能的。静态字符串只有一个副本(每个类加载器),但可以有多个子类

但是,您可以为每个(子)类创建一个静态字段,然后使用一个方法

public class Child extends Parent {
   private static final String NAME = "some alias";

   @Override
   public String getName() {
       return NAME;
   }
}

这是一种可以用来避免反射的技术(名称通常不等于类名,但使用了一些别名-它也可以用于枚举而不是字符串)。

我知道的唯一方法是: 创建接受父类中字符串的受保护构造函数

class Parent {
    private final String className;
    protected Parent(String className) {
         this.className = className;
    }
}

public class Child extends Parent {
    public Child() {
        super("Child");
    }
}
顺便说一句,您甚至可以使用paren的custructor中的
new Throwable().getStackTrace()
来改进这一点。在这种情况下,您甚至不必强制所有子项将其名称传递给父项

class Parent {
    private final String className;
    protected Parent() {
         StackTraceElement[] trace = new Throwable().getStackTrace();
         this.className = trace[1].getClassName();
    }
}

尽管不能使用静态变量,但请尝试此代码

  class Parent{
    final String className;
    public Parent(){
     className=this.getClass().getName();
    }
  }

对于必需的子类也要这样做

为什么要这样做,因为可以通过其他方式获得类名?我有时也希望这是可能的。但事实并非如此。单词
static
已经表示成员/方法等静态链接到持有它的类。你不能重写它-因为当链接是动态完成的,比如实例成员/方法可能重复你将如何使用它,测试方法实际上并没有说太多。我正在编写一个API供其他开发人员使用,我想要一些方法来验证包名,使用API的各种插件的类。我计划让开发人员对父类进行子类化,并将此静态字符串与各种请求一起传递给我们的服务。(不可否认,字符串可能更容易实现相同的目标,而不会是静态的)。如何实现这一目标还有其他建议吗?看起来它开始变成一个设计问题了…哦,闻起来有点可疑<代码>跟踪[1]。getClassName()。。。不过这主意不错:)如果你想走这条老路,我宁愿使用
Thread#getStackTrace()
,因为这样可以避免不必要且相对昂贵的异常构造和stacktrace克隆。提供一个带参数的抽象构造函数是一种方法。@BalusC:抽象构造函数的缺点是,每个实例都包含一个字符串副本,与静态字段相比,这是一种内存浪费。@Chris:如果将字符串设为常量,则可以忽略不计。另请参见您自己的答案和链接的可能重复。@BalusC:Depends-指针仍然是4字节。对于树中的许多小对象(例如,类似DOM的结构),我倾向于避免使用它,因为我看不到真正的优势:-)非常感谢,男士:)我只得到packagename.class这不是问题,但这非常有用