我使用一个动态生成类的java应用程序。通过ant脚本,将为给定的类名和类模板生成源代码。
在类的模板中,我需要知道这个类的名称,以调用类的静态方法。
实施例。该类将命名为“VersionInfo”。然后在静态main()中我想调用静态方法:VersionInfo.getId()。 但我不知道班级名称。
对于静态上下文或某些实用程序类是否有相当于“this”的目的?
答案 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);