一个类如何访问自己的类名?

时间:2009-05-11 11:35:49

标签: java

我使用一个动态生成类的java应用程序。通过ant脚本,将为给定的类名和类模板生成源代码。

在类的模板中,我需要知道这个类的名称,以调用类的静态方法。

实施例。该类将命名为“VersionInfo”。然后在静态main()中我想调用静态方法:VersionInfo.getId()。 但我不知道班级名称。

对于静态上下文或某些实用程序类是否有相当于“this”的目的?

8 个答案:

答案 0 :(得分:7)

如果您是通过Ant创建类,那么为什么不生成一个返回类名的静态方法getClassName?

答案 1 :(得分:3)

如果您的main方法位于同一个类中,您可以在main方法中调用getId()

答案 2 :(得分:2)

所以你说它应该产生这个?

public class VersionInfo{ // VersionInfo class name changes, per problem description
    public static void main(){
        System.out.println(getId()); 
// but in the main within the class,we don't need the classname to call a static method
    }
    public static string getId(){
       return "what's the problem?";
    }
}

描述中是否缺少某些内容,您是通过未知的模板名称调用其他类的静态方法?

答案 3 :(得分:1)

有一个讨厌的解决方法:

public static final Class THIS_CLASS = new Object() {
  public Class getParentClass() {
    return getClass().getEnclosingClass();
  }
}.getParentClass();

答案 4 :(得分:1)

我不确定我理解。如果您自己生成类VersionInfo,为什么不能从生成类的代码中获取类名?

答案 5 :(得分:1)

试试这个:

package uk.co.farwell.stack_overflow;

public class Test_847708 {
    private final static String getId() {
        return "string";
    }

    public static void main(String args[]) {
        System.out.println("getId=" + getId());
    }

}

答案 6 :(得分:0)

您不能在静态上下文中使用“this”键。

相反,如果要动态调用静态函数,可以使用java reflection

我无法帮助你进一步了解java反射,因为我从不使用它,但我已经在.Net中使用它,它是一个强大的工具。

答案 7 :(得分:0)

这个问题最干净的答案可能是创建一个第三个类,其中包含一个静态的已知名称,该名称由引用动态类名的ANT脚本生成,然后让您的主方法引用该已知类。

如果由于某种原因还不够,那么将Joachim Sauer和Melursus的答案结合起来,得到类名,然后通过反思得到方法:

Method m = THIS_CLASS.getDeclaredMethod("getId", null);
Object result = m.invoke(null, null);