【问题标题】:Class[] - What does it mean?类[] - 这是什么意思?
【发布时间】:2011-03-05 05:39:39
【问题描述】:

我正在看一个教程:http://www.ibm.com/developerworks/library/j-dyn0603/

特别是有一个部分给出了以下示例:

Class[] types = new Class[] { String.class, String.class };
Constructor cons = TwoString.class.getConstructor(types);
Object[] args = new Object[] { "a", "b" };
TwoString ts = (TwoString)cons.newInstance(args);

我不太明白 Class[] 代表什么。我读它的方式,这说'一个称为类型的类对象数组]。我对 new 语句中使用的语法也有些不熟悉 - new Class[] { String.class, String.class} 是如何工作的?

如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

标签: java reflection


【解决方案1】:

是的,字面意思就是你想的那样

Class[] types = new Class[] { String.class, String.class }; 是一行中的声明和初始化。它说创建一个包含Class 类型对象的数组,并用Class 类型的两个对象初始化它,即String.class 和String.class。

类似的例子是

int[] nums = new int[]{1,2,3};

float[] decimals = new float[]{1.2, 3.1, 5.2}

【讨论】:

  • 酷,我以前没见过这种语法。我的理解是你可以说 Int[] nums = {1,2,3};并跳过新语句。
  • 是的。当您使用这样的初始化时,语法有点多余。我的内部结构不够好,但也许有一个原因他们不只是在没有new Class[] 部分的情况下这样做
  • new type[]{...} 语法也适用于未在同一语句中声明变量的情况。
【解决方案2】:

这是Class类型的数组

new Class[] {...}

创建Class 类型的数组,其内容在其中列出。

一般

Type[] 的意思是,一个“...的数组”,就像你想象的那样。

原来这里的类型是Class,在Java中它是一个正在运行的类或接口的表示。

您可能不应该在不了解基础知识的情况下使用反射等高级功能。

【讨论】:

  • 让我感到困惑的是 new Blah[] { a, b, c} 的语法。我不太确定那里发生了什么。我对 JVM、类加载器、字节码、反射等非常熟悉。主要是一个 n00b 语法问题。
  • @nazbot 我很高兴听到这个消息。我认为这是您第一次了解该语言,而反思绝对不是一个好的开始。
  • 确实如此。欣赏答案。 :)
【解决方案3】:

它是一个共享超类型Class的对象数组。

在 Java 中,一切都是Object。这意味着如果你想对类类型有代码内感知,你需要创建一个Object,它可以封装类的细节。 Java 将此 Object 称为 Class

注意大写并注意,由于ClassObject,您可以在类上调用所有Object 方法,例如x.getClass()x.wait()x.hashcode()

Class[] items = { String.class, Integer.class };

表示创建一个名为 items 的数组,其中包含 Class 对象。用代表String 的类和Integer 的类的Objects 初始化数组。

由于Class 对象代表类类型,因此两者在非正式演讲中经常互换使用。

【讨论】:

  • erh.. 在 java 中,并非一切都是对象。
  • @Oscar,好的,是的,有原语。但是如果你深入研究 JVM 的实现,你会发现接口是作为类实现的,像对象一样处理。
【解决方案4】:

Class 是描述 java 类(或接口)的 ObjectClass[] 是这些对象的数组。

语法<ClassName>.class(例如String.class)返回特定java类(或接口)的Class

可以通过一些语法创建一个新数组。 new Class[i] 创建一个新的 Class 数组,长度为 i 并填充默认值(空引用)。 new Class[]{a, b, c} 创建一个包含给定元素 abcClass 新数组。它的长度是 3,因为给出了 3 个元素。

【讨论】:

    【解决方案5】:
    1. Class其实是一个类,名字叫,嗯..类。

      Class 类的实例表示正在运行的 Java 应用程序中的类和接口。

    2. new Class[] 有效。它初始化一个类引用数组。但是,与对象数组一样,引用为空。

    3. Class 没有公共构造函数。所以你不能说new Class()

    【讨论】:

      【解决方案6】:

      Class 是一个 java 类,它表示......一个类和相关的元数据。所以Class[]Class 对象的数组。

      java 中的每个类都有一个名为 class 类型的静态成员变量,这里你正在做的是

      1. 创建一个包含两个 每个成员都是 类型类,特别是类 表示 java.lang.String
      2. 通过反射查找 对构造函数的引用 需要两个的类 TwoString java.lang.String 对象 => 两个字符串(字符串,字符串)
      3. 创建一个对象数组来提供给 值为“a”的构造函数 和“b”
      4. 终于创建了一个实例 通过调用 TwoString ts 您在 (b) 中查找的构造函数和 您在 (c) 中初始化的参数

      这相当于:

      TwoString ts = new TwoString("a","b");
      

      但您发布的方式是使用反射/内省。

      【讨论】:

        【解决方案7】:

        我不确定这是否是您要查找的内容,但示例中的 Class[] 正在模仿该 TwoString 类中的构造函数。对我来说,如果他们使用两种不同的类型会更清楚。所以如果 TwoString 类看起来像这样:

        public class TwoString {
        
            private String m_s1;
            private Integer m_s2;
            public TwoString(String s1, Integer s2) {
                m_s1 = s1;
                m_s2 = s2;
            }
        
        
        }
        

        类名从此不再生成,但我认为这很容易解决。代码示例的其余部分将变为:

        Class[] types = new Class[] { String.class, Integer.class };
        Constructor cons = TwoString.class.getConstructor(types);
        Object[] args = new Object[] { "a", 1 };
        TwoString ts = (TwoString)cons.newInstance(args);
        

        所以类数组是设置构造函数来使用的。逐行的步骤是:

        1. 类数组设置要使用的构造函数。
        2. 然后找到构造函数。
        3. 您设置要传递给构造函数的值。
        4. 然后调用构造函数来创建实例。

        【讨论】:

          猜你喜欢
          • 2013-08-17
          • 2011-09-04
          • 2018-10-29
          相关资源
          最近更新 更多