4

Reflexion API 表明任何 Java 数组类都实现了接口 java.lang.Cloneable 和 java.io.Serializable。它没有声明任何成员。

我的问题是:

  • 这个“长度”是在哪里定义的?

  • 使用协变返回类型(字节 [] 替换对象)使用公共访问说明符覆盖受保护对象 clone(),因为我们可以直接将其分配给字节 []?

  • 与 Cloneable 和 Serializable 的关联(IS-A)在哪里定义?

byte[] 类的访问说明符还包含“abstract final”,它不是 Java 中任何类或方法的合法组合。

    import java.lang.reflect.*;

    public class ArrayExplorer {

      public static void main(String[] args) {
      explore("Current class:", byte[].class);

      byte[] bytes = { 65, 'A' };
      System.out.println(bytes.length);

      byte[] cloned = bytes.clone();
      System.out.println(cloned);

   }

private static void explore(String msg, Class<?> class1) {
    if (class1 == null)
        return;

    System.out.println("**************************************\n" + msg
            + Modifier.toString(class1.getModifiers()) + " " + class1);

    // if (class1 == Object.class)
    // return;
    Field[] fields = class1.getDeclaredFields();
    for (Field field : fields) {
        System.out.println(field);
    }

    Method[] methods = class1.getDeclaredMethods();
    for (Method method : methods) {
        System.out.println(method);
    }

    explore("Superclass:", class1.getSuperclass());
    explore("Classes:", class1.getClasses());
    explore("ComponentType:", class1.getComponentType());
    explore("DeclaredClasses:", class1.getDeclaredClasses());
    explore("DeclaringClass:", class1.getDeclaringClass());
    explore("EnclosingClass:", class1.getEnclosingClass());

    if (!class1.isInterface()) {
        explore("Interfaces:", class1.getInterfaces());
    }

}

private static void explore(String msg, Class<?>[] classes) {
    if (classes == null || classes.length == 0)
        return;
    System.out.println(msg);
    for (Class<?> class1 : classes) {
        explore("", class1);
    }
    }
  }
4

2 回答 2

0

JavaDoc

getDeclaredMethods

返回一个 Field 对象数组,反映由此 Class 对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类或接口未声明任何字段,或者此 Class 对象表示原始类型、数组类或 void,则此方法返回长度为 0 的数组。

getDeclaredMethods

返回一个 Field 对象数组,反映由此 Class 对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类或接口未声明任何字段,或者此 Class 对象表示原始类型、数组类或 void,则此方法返回长度为 0 的数组。

于 2012-07-20T06:54:43.147 回答
0

java中的数组有点像原语:虽然有一个Array.class表示它的数组,但它并没有真正的“代码”,因为类型是内置在语言中的,所以它的诸如lengthetc之类的字段不能通过反射访问.

于 2012-07-20T05:23:35.297 回答