4

Reflexion APIは、Java配列クラスがインターフェースjava.lang.Cloneableおよびjava.io.Serializableを実装していることを示しています。メンバーは宣言されていません。

私の質問は次のとおりです。

  • この「長さ」はどこで定義されていますか?

  • 保護されたオブジェクトclone()は、byte []に​​直接割り当てることができるため、共変リターンタイプ(Objectを置き換えるbyte [])を使用してパブリックアクセス指定子でオーバーライドされますか?

  • CloneableおよびSerializableとの関連付け(IS-A)はどこで定義されていますか?

また、byte []クラスのアクセス指定子には、Javaのクラスまたはメソッドの正当な組み合わせではない「abstractfinal」が含まれています。

    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

Javaの配列は、プリミティブに少し似ていますArray.class。それを表すためのがありますが、型が言語に直接組み込まれているため、実際には「コード」がありません。そのため、lengthetcなどのフィールドにはリフレクションでアクセスできません。 。

于 2012-07-20T05:23:35.297 に答える
0

JavaDoc

getDeclaredMethods

このClassオブジェクトによって表されるクラスまたはインターフェイスによって宣言されたすべてのフィールドを反映するFieldオブジェクトの配列を返します。これには、パブリック、保護、デフォルト(パッケージ)アクセス、およびプライベートフィールドが含まれますが、継承されたフィールドは除外されます。返される配列内の要素は並べ替えられておらず、特定の順序ではありません。このメソッドは、クラスまたはインターフェイスがフィールドを宣言していない場合、またはこのClassオブジェクトがプリミティブ型、配列クラス、またはvoidを表す場合、長さ0の配列を返します。

getDeclaredMethods

このClassオブジェクトによって表されるクラスまたはインターフェイスによって宣言されたすべてのフィールドを反映するFieldオブジェクトの配列を返します。これには、パブリック、保護、デフォルト(パッケージ)アクセス、およびプライベートフィールドが含まれますが、継承されたフィールドは除外されます。返される配列内の要素は並べ替えられておらず、特定の順序ではありません。このメソッドは、クラスまたはインターフェイスがフィールドを宣言していない場合、またはこのClassオブジェクトがプリミティブ型、配列クラス、またはvoidを表す場合、長さ0の配列を返します。

于 2012-07-20T06:54:43.147 に答える