クラスは、Javaリフレクションを使用しています-array

Javaリフレクションに関するその他の記事:https://blog.csdn.net/ilo114/article/category/8633303
言うまでもなく私たちは皆知っていると言うためにjava.lang.ArrayJavaのリフレクションパッケージの配列操作のタイプです。言うために、この配列のJavaSE8のドキュメントを参照:

Arrayクラスは動的にJava配列を作成し、アクセスするためのstaticメソッドを提供します。

Arrayクラスは動的にJava配列を作成し、アクセスするためのstaticメソッドを提供します。Accessは、動的に近い外観を作成することができ、理解しやすいです。

のは、見てみましょう###java.util.Arrays

  • 配列は、いくつかの小さなパートナーがこの種のツールを何度も使用していると信じていることを注意、我々が使用するアレイの動作の多くの便利な方法を提供します。

  • その上でjava.lang.Array、私たちの静的、動的に作成するための方法およびアクセスアレイに使用可能です。配列copyOfが動的にそれの配列を操作する方法である方法で見てみましょう。

    public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }
    

    copyOfはそれをやってに使用されていますか?アレイへのアレイのサイズに拡大するには、この方法の主アレイプロバイダが充填されています。

    あなたはこれを使用することができます

    User[] users = new User[10];
    ...//假如满了,给数组长度翻倍。
    users = Arrays.copyOf(users, users.length * 2);
    

    私はあなたが気づいていないかわからない、これは一般的な方法が結果を返すです。その最初のパラメータは、元の配列は、2番目のパラメータは、別のオーバーロードされた呼び出しによって返された新しい長さ、であるcopyOf方法。この過負荷状態では、見てみましょうcopyOf方法、それを。

    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
    

    呼び出しがクラスに合格し、オブジェクトの場合は、元のオブジェクトは[]クラスの配列に来る直接に等しいことを理解することは困難ではない内部にnew Object[]等しくない場合、コール新しいアレイを作成する方法を、呼び出しが続くソースコードにおけるメソッドの役割コメントは以下のとおりです。冒頭では、あなたがしたいですかどこで配列の指定された位置にまで、位置を指定した時にソースの配列からコピー配列は、指定された。意味:ターゲット配列の指定した場所に指定された配列の位置の開発からコピーを開始します。java.lang.reflect.ArraynewInstanceSystem.arraycopy

拡張アレイを達成するために、なぜ利用リフレクション

  • 私たちは、実現の反射を見ていません"copyOf"

    private static Object[] badCopyOf(Object[] arr, int newLength) {
        Object[] newArray = new Object[newLength];
        System.arraycopy(arr, 0, newArray, 0, Math.min(arr.length, newLength));
        return newArray;
    }
    

    上記がなけれという方法は、多くの人が直接少し有罪書き込みコードの上になりますことがあります。しかし、問題のない考えはありません、彼はあなたがしたいクラスに対応に移行することができますか?セイ、中クラスのターン、その後、引き返すことは可能ですが、最初から、配列のに変換することができない、これがスローされます配列が使用されているので、例外をの作成で、Java配列の作成をバック覚えているとき、各要素の種類、時間のタイプ。ArrayscopyOfMyObject[]Object[]Object[]MyObject[]ClassCastExceptionnew Object[length]new

  • それでは、どのように強い私たちはそれを回すことができますか?次のコードを参照してください。

    private static Object goodCopyOf(Object arr, int newLength) {
      Class cls = arr.getClass();
      if (!cls.isArray()) {
          return null;
      }
      Object newArray = Array.newInstance(cls.getComponentType(), newLength);
      System.arraycopy(arr,0,newArray,0,Math.min(Array.getLength(arr), newLength));
      return newArray;
    }
    

    上記のコードを読んで、いくつかの小さなパートナーはなぜ配列の基本データ型は、オブジェクトの配列を渡すことはできませんので、オブジェクトの配列を受け取るオブジェクトをする必要があり、疑問を持っていますが、オブジェクトになることができます

    double[] arr = {1.1, 1.2, 1.4, 12.2};
    arr = (double[]) goodCopyOf(arr, 10);
    

配列アクセス内のオブジェクト

  • Arrayクラスは使用に私たちのためにいくつかの方法を提供します
static Object get(Object array, int index) 場所にある要素を返します
static XXX getXXX(Object array, int index) XXXは基本型、同書です。
static void set(Object array, int index, Object value) オブジェクトの指定された位置に設定し
static void setXXX(Object array, int index, XXX z) オブジェクトの指定された位置の設定、XXX基本データ型
static Object newInstance(Class<?> componentType, int length) オブジェクトの配列を作成します。

もっとからのJava SE *公式文書https://docs.oracle.com/javase/8/docs/api/

次のように完全なコードです

package io.ilss.reflection;

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * className ArrayTest
 * description ArrayTest
 *
 * @author feng
 * @version 1.0
 * @date 2019-01-29 23:42
 */
public class ArrayTest {
    public static void main(String[] args) {
        double[] arr = {1.1, 1.2, 1.4, 12.2};
        arr = (double[]) goodCopyOf(arr, 10);
        System.out.println(Arrays.toString(arr));

        String[] arr1 = {"aa", "bb", "cc"};
        arr1 = (String[]) goodCopyOf(arr1, 10);
        System.out.println(Arrays.toString(arr1));

        System.out.println("ClassCastException");
        arr1 = (String[]) badCopyOf(arr1, 20);
    }

    private static Object[] badCopyOf(Object[] arr, int newLength) {
        Object[] newArray = new Object[newLength];
        System.arraycopy(arr, 0, newArray, 0, Math.min(arr.length, newLength));
        return newArray;
    }

    private static Object goodCopyOf(Object arr, int newLength) {
        Class cls = arr.getClass();
        if (!cls.isArray()) {
            return null;
        }
        Object newArray = Array.newInstance(cls.getComponentType(), newLength);
        System.arraycopy(arr, 0, newArray, 0, Math.min(Array.getLength(arr), newLength));
        return newArray;
    }
}

Githubの関連コード:https://github.com/ilssio/java-base-ilss

公開された34元の記事 ウォン称賛7 ビュー8176

おすすめ

転載: blog.csdn.net/ilo114/article/details/86698141