Java 是否可以在静态方法中访问类对象?
考虑以下Java类:Java 是否可以在静态方法中访问类对象?,java,Java,考虑以下Java类: public class Foo { public static void doStuff() { // boring stuff here } } 是否可以从静态方法(如doStuff())中访问类literalFoo.class,或仅访问类名“Foo”?在非静态方法中,我只调用this.getClass(),但在静态方法中没有this 编辑:很抱歉,这不清楚-我想显式使用class literalFoo.class使用clas
public class Foo
{
public static void doStuff()
{
// boring stuff here
}
}
是否可以从静态方法(如doStuff()
)中访问类literalFoo.class
,或仅访问类名“Foo”
?在非静态方法中,我只调用this.getClass()
,但在静态方法中没有this
编辑:很抱歉,这不清楚-我想显式使用class literal
Foo.class
使用class clazz=Foo.class
如果您需要以下内容:
class Foo {
static Class foo(){return the current class}
}
class Bar extends Foo {
}
如果在
Bar
上调用Bar
,则期望Bar.foo()
返回Bar
,如果在foo
上调用foo
,则期望foo()返回Bar
——您的设计中存在一些错误,可能需要使方法非静态。只需使用foo.class
。您不必担心继承之类的问题,因为没有与静态方法关联的对象。处理静态方法时,您可以将它们视为库,其中类名成为库名。通过指定库(类)名称,可以告诉编译器要运行哪个bar()方法Foo.bar()
vs.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
构造来引用当前的类。不幸的是,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;
}
私有静态StackTraceeElement GetCallersTackTraceeElement(StackTraceeElement[]元素){
for(int i=0;i
在本例中,MyLogger是存在此方法的类。它在stacktrace中找到自己,并在前面运行一次,然后从StackTraceElement中提取类
StackTraceElement[]数组可以由new Exception().getStackTrace()或Thread.currentThread().getStackTrace()检索;该方法的编写方式假定stacktrace是在对MyLogger的第一次方法调用时创建的。我的问题的全部要点是在不引用Foo.class
的情况下执行此操作。要真正回答您的问题,可以在静态方法中使用Foo.class
,但不能使用this.getClass()
。这是一个问题的唯一原因是Java奇怪的静态方法继承(说真的,静态方法不应该落入子类……c#明确禁止这样做)。静态方法在Java中不是虚拟的。这是使用工厂模式的原因之一。你能详细说明一下你到底做了什么吗?也许可以添加一点代码?