考虑以下Java类:
public class Foo
{
public static void doStuff()
{
// boring stuff here
}
}
是否可以从静态方法(例如Foo.class
)访问类文字"Foo"
或类名doStuff()
?在非静态方法中,我只需调用this.getClass()
,但在静态方法中没有this
。
编辑:抱歉这不清楚 - 我想明确使用类文字Foo.class
来执行此操作。
答案 0 :(得分:2)
使用Class<Foo> clazz = Foo.class
如果您需要以下内容:
class Foo {
static Class foo(){return the current class}
}
class Bar extends Foo {
}
并期望Bar.foo()
在Bar
上被调用时返回Bar
,如果在Foo
上调用Foo
- 您的设计可能有问题你需要使方法非静态。
答案 1 :(得分:1)
不幸的是,Java并没有给你一个很好的方法来做到这一点。您只需要参考Foo.class
。这对我来说是一种常见的烦恼。
对于日志记录,我通过读取堆栈解决了它(解决方案的想法来自Log5j),因为每次为每个记录器重新创建类都非常烦人。幸运的是,现代IDE使其变得相对轻松,因此如果您必须更改类的名称,重构不会受到负面影响。
编辑:一些代码:
private static StackTraceElement getCallerStackTraceElement(StackTraceElement[] elements) {
for (int i = 0; i < elements.length; i++) {
if (elements[i].getClassName().equals(MyLogger.class.getName())) {
return elements[i + 1];
}
}
return null;
}
在这种情况下,MyLogger是此方法所在的类。它在堆栈跟踪中找到它并且更早出现,然后从StackTraceElement中提取类。
可以通过新的Exception()。getStackTrace()或Thread.currentThread()来获取StackTraceElement []数组.getStackTrace();编写此方法的方式是假设在第一次调用MyLogger方法时创建了堆栈跟踪。
答案 2 :(得分:0)
只需使用Foo.class
即可。您不必担心继承或类似的事情,因为没有与静态方法相关联的对象。
答案 3 :(得分:0)
处理静态方法时,可以将它们视为库,其中类名称成为库名。通过指定库(类)名称告诉编译器运行哪个bar()方法。 Foo.bar()
与Bar.bar()
。
该方法本身没有父级,也没有实例,因此,它不能使用反射来知道它所属的类。但是,您可以添加反射方法。
您可以向类中添加一个静态方法,以便自己回答它所在的类:
public class Foo {
private static class self() {
return Foo.class;
}
public static void doStuff()
{
// Use self() to reference the Foo class
}
}
请注意,我将self()方法设为私有,因为在类之外,它没有任何意义。
这是有效的,因为self()方法在类内部和静态方法中是可见的。
相比之下,PHP有self
构造来引用当前类。