【问题标题】:Why passing .class name in constructor function in Java为什么在 Java 的构造函数中传递 .class 名称
【发布时间】:2014-08-12 03:15:51
【问题描述】:

我见过很多将 *.class 作为参数传递给 constructor 函数的 Java 代码示例。我为什么要这么做?我什么时候可以这样做?

例如:

ServletHolder sh = new ServletHolder(ServletContainer.class);

【问题讨论】:

  • 当构造函数请求一个类对象时。
  • 然后我可以通过 ABC a=new ABC();我可以传递对象吗?我为什么要做 ABC.class 之类的事情?

标签: java


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      构造函数显然是在寻找一个类对象,但我想你可能会问一个更深层次的问题,为什么一个类的实例想知道另一个类。造成这种情况的原因有很多,但它们大多围绕着反思。反射允许程序通过名称检查类的结构、构造函数、方法、接口等,然后能够调用它们。

      【讨论】:

        猜你喜欢
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-16
        • 2016-03-29
        • 2014-10-08
        • 2013-12-12
        • 1970-01-01
        相关资源
        最近更新 更多