首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在静态方法中访问Class对象?

是否可以在静态方法中访问Class对象?
EN

Stack Overflow用户
提问于 2010-04-15 18:47:20
回答 4查看 185关注 0票数 1

考虑以下Java类:

代码语言:javascript
复制
public class Foo
{
    public static void doStuff()
    {
        // boring stuff here
    }
}

是否可以从静态方法(如Foo.class )中访问类文本"Foo",或者只访问类名"Foo"?在非静态方法中,我只需要调用this.getClass(),但是在静态方法中不需要使用this

编辑:对不起,这不是很清楚--我想显式地使用类文本Foo.class来完成这个任务。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-15 19:25:36

不幸的是,Java并没有给您提供一个很好的方法来实现这一点。你只需参考Foo.class。这是我经常烦恼的事情。

对于日志记录,我通过读取堆栈来解决它(解决方案的想法来自Log5j),因为每次为每个记录器重新声明类都很烦人。幸运的是,现代IDE使它相对没有痛苦,因此,如果您必须更改类的名称,重构不会受到真正的负面影响。

编辑:一些代码:

代码语言:javascript
复制
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中提取类。

StackTraceElement[]数组可以通过新异常().getStackTrace()或Thread.currentThread().getStackTrace()检索;该方法的编写方式假定在第一个方法调用到MyLogger时创建了堆栈跟踪。

票数 1
EN

Stack Overflow用户

发布于 2010-04-15 18:49:18

使用Class<Foo> clazz = Foo.class

如果你需要这样的东西:

代码语言:javascript
复制
class Foo {
    static Class foo(){return the current class}
}

class Bar extends Foo {

}

如果在Bar.foo()上调用Bar,那么期望Bar返回Foo,如果调用Foo,则返回Foo--您的设计有问题,也许您需要使这些方法是非静态的。

票数 2
EN

Stack Overflow用户

发布于 2010-04-15 18:50:13

只需使用Foo.class。您不必担心继承或诸如此类的问题,因为没有与静态方法相关联的对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2648091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档