Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类如何访问自己的类名?_Java - Fatal编程技术网

Java 类如何访问自己的类名?

Java 类如何访问自己的类名?,java,Java,我使用一个动态生成类的java应用程序。通过ant脚本,将为给定的类名和类模板生成源代码 在类的模板中,我甚至需要知道这个类的名称,以便调用该类的静态方法 例如。该类将命名为“VersionInfo”。然后在它的static main()中,我想调用静态方法:VersionInfo.getId()。 但是我不知道班名 对于静态上下文,是否有与“this”等价的类或用于此目的的某个实用程序类?在静态上下文中不能使用键“this” 相反,如果要动态调用静态函数,可以使用 我无法进一步帮助您了解jav

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

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

例如。该类将命名为“VersionInfo”。然后在它的static main()中,我想调用静态方法:VersionInfo.getId()。 但是我不知道班名

对于静态上下文,是否有与“this”等价的类或用于此目的的某个实用程序类?

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

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


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

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

有一个棘手的解决方法:

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

我不太明白。如果您自己生成类
VersionInfo
,为什么不能从生成类的代码中获取类名?

如果您的主方法位于同一个类中,您只需在主方法中调用
getId()

这个问题最清晰的答案可能是使用静态的已知,由引用动态类名的ANT脚本生成的名称,然后让主方法引用该已知类

如果出于某种原因这还不够,那么结合Joachim Sauer和Melursus answer,并获得类名,然后通过反射获得方法:

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

你是说它应该产生这个

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?";
    }
}
描述中是否缺少某些内容,即您正在通过模板名称未知的方式调用其他类的静态方法?

尝试以下操作:

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

}

这肯定是一个令人讨厌的解决办法,但并不能完全解决他的问题。如果他需要引用ClassName.method(),拥有Class对象没有任何帮助,除非作为reflection.sry的启动程序,用于不准确的描述。试图使示例简单,但实际上这是误导。当然,主要的方法是在另一个类别中,我想知道更多关于需求的信息。如下文所述,如果方法是静态的,您可以直接引用该方法的名称:getId()。你不需要使用反射。请看下面我的答案,如果我是对的,请投鲁道夫森一票,因为他比我先得到了答案。我按照提议解决了它。(对“为什么”的回答是:我希望有一些方便的java方法——因为现在我必须深入研究生成源代码的应用程序……)