Java数组类的成员

时间:2012-07-20 04:59:33

标签: java

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

我的问题是:

  • 这个'长度'定义在哪里?

  • 使用公共访问覆盖受保护的Object clone()的位置 说明符使用co-variant返回类型(byte []替换Object) 可以直接将其分配给字节[]?

  • 与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);
    }
    }
  }

2 个答案:

答案 0 :(得分:0)

java中的数组有点像原语:虽然有Array.class来表示它,但它实际上没有“代码”,因为类型是内置于语言中的,所以它的字段像length等不能通过反思来访问。

答案 1 :(得分:0)

的JavaDoc

getDeclaredMethods

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

getDeclaredMethods

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