Java反射について

1738 ワード

転載は出典を明記してください。http://egoistk21.xyz/2016/10/12/Java反射について説明します。
今学期は学校が始まったばかりの時、叡思(私達の学校のBBS)で先輩の助けを見ました。収集しました。その時、自分はまだHexoブログを作っています。研究する時間がないです。昨日は見てみました。
public class A {
    protected String getString() {
        return "A";
    }
}

public class B extends A {
    protected String getString() {
        return "B";
    }
}

public class C extends B {
}
サブクラスCのオブジェクトのうち、親タイプAにおけるget Stringメソッドへのアクセスが要求されます。
この問題はもちろんCクラスにAクラスのメンバーを加えてコンパイルする時には予知できないタイプのオブジェクトにアクセスしたいです。反射を使う必要があります。今日は反射で種類の情報を調べます。
まずJavaのクラスについて話します。クラスは共通の特徴を持つ対象の抽象的なものです。クラスはこれらの抽象的なものです。つまりクラスはすべての種類のクラスです。クラスの例は、実行中のJavaアプリケーションのクラスとインターフェースを表します。Classには公共構造の方法がありません。クラスのオブジェクトは、クラスをロードする時にJava仮想マシンとクラスキャリアの中のdefineClassを呼び出す方法で自動的に構成されます。例えばcar.get Class().get Name()また、クラスの額面値を使用して、指定されたタイプ(または、void)のクラスのオブジェクトを取得することもできます。例えば、Card.class.getName()実行中のJavaアプリケーションのクラスを取得する方法があります。
public class C extends B {
    public static void main (String args[]){
        Class a = C.class.getSuperclass().getSuperclass();
        try {
            Object o = a.newInstance();
            A c = (A)o;
            System.out.println(c.getString());
        } catch(Exception e) {
            e.printStackTrace();
        }
    } 
}
それとも下のほうがいいですか?
public class C extends B {
    public static void main (String args[]){
        Class a = C.class.getSuperclass().getSuperclass();
        try {
            Method m = a.getDeclaredMethod("getString",null);
            System.out.println(m.invoke(a.newInstance(),null));
        } catch (Exception e) {
            e.printStackTrace();
        }
    } 
}
次のページでは、プライベート属性とメソッドを反射で呼び出す方法を説明します。
おやすみなさい。