我有一个名为T的字段(抱歉)T.T有一个静态方法M.我试图调用T的静态方法TM(),但编译器认为我引用了字段,而不是类和失败的错误"非静态变量不能从静态上下文引用"。除了重命名之外,有什么方法我可以明确地指出我想要的是类,而不是变量吗?
class A
{
T T;
static void X() { T.M(); }
}
class T
{
static public void M() { }
}
答案 0 :(得分:4)
鉴于您的类位于包中,请将包的名称添加到您的T类名称以形成FQCN:
package com.stackoverflow;
class A
{
T T;
void X() { com.stackoverflow.T.M(); }
}
class T
{
static public void M() { }
}
另一种解决方案,使用反射
package com.stackoverflow;
import java.lang.reflect.InvocationTargetException;
class A
{
T T;
void X() {
try {
com.stackoverflow.T.class.getDeclaredMethod("M").invoke(null, null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
class T
{
static public void M() {
System.out.println("M");
}
}
答案 1 :(得分:0)
您可以使用Class.forName("T")
- 获取名为T的类对象。
答案 2 :(得分:0)
你真的应该重命名变量。
如果您的类型在包中,请使用Diego的答案。
如果你真的真的不想重命名变量并且你的类不在包中,你可以用反射来做这个可恶的事情:
Class classT = T.class;
Method staticMethod = classT.getMethod("M", null);
staticMethod.invoke(null);
答案 3 :(得分:0)
只需添加一个选项:
Class.forName( "T" ).getMethod( "M" ).invoke( null );
如果班级名称只是" T"这将有效。 - 没有包裹。