为什么在Java中的构造函数中传递.class名称

时间:2014-08-12 03:15:52

标签: java

我见过很多 Java 代码示例,它们将* .class作为参数传递给构造函数函数。我为什么要这么做?我什么时候会这样做?

例如:

ServletHolder sh = new ServletHolder(ServletContainer.class);

3 个答案:

答案 0 :(得分:3)

通常这用于允许Java中的Reflection创建传入的类的具体版本。例如,Arrays.copyOfRange(...)有一个重载,它接受一个类参数来返回一个用Class []键入的实际数组。传递给方法。

如果没有参数,它将返回Object[]。使用该参数,它将返回一个这样的数组,例如SomeClass[]

答案 1 :(得分:1)

T.class的类型为Class<T>。它使您可以将类本身作为对象访问。 Oracle docs有许多不同的示例,说明如何获取Class<T>对象。

他们通常会使用反射来对类本身进行一些元操作。有一个SO thread with some examples

例如,我可能会定义一个Logger对象,该对象将Class<T>作为参数。然后它可以做以下事情:

class LoggerForClass<T> {
    String className;

    public LoggerForClass(Class<T> klass) {
        className = klass.getName();
    }

    public String log(String message) {
        return className + ": " + message;
    }
}

答案 2 :(得分:1)

构造函数显然正在寻找一个类对象,但我想你可能会问一个更深层次的问题,为什么一个类的实例想知道一个不同的类。这有很多原因,但它们主要围绕反思。 Reflection允许程序按名称检查类的结构,它的构造函数,方法,接口等,然后能够调用它们。