アクセスにJavaリフレクションを学習Fieldクラスと変数を変更

Fieldクラスは、クラスメンバーのプロパティと値いくつかの方法へのアクセスを提供し、最も一般的なのは、メンバ変数の値を訪問し、変数の値を変更することです。

プライベート、修飾子は、連続的に小さくなる提供私たちは皆知っている、変数の修飾pubilcがあり、保護された、デフォルトへのアクセスなど、民間の修正にのみ、このクラスにアクセスすることができ、しかし、java.lang.reflet.Fieldクラスによってアクセスおよび変更することができます次のようにプライベートはたとえば、プライベート変数を変更しました:

 

Personクラスとその変数にアクセスされるのを待っています。

パブリック クラス人{ 
    
    公共の文字列名=「グラハム」保護された文字列のセックス=「男」
    文字列の州 =「天津」プライベート int型 = 26歳

}

フィールドクラスのget(オブジェクトOJB)とセット(オブジェクトOJB、オブジェクト値)により、アクセスと完全にプライベートメンバーをPersonクラスを変更します。

パブリック クラスTestClassを{
     パブリック文字列AA =「AAA」プライベート文字列BB = "BBB" ;
    保護された文字列CC =「CCC」

    パブリック 静的 ボイドメイン(文字列[]引数)がスロー持たないNoSuchFieldException、IllegalAccessExceptionが{ 
        人の人物 = 新しい人を()。

        // 访问公有成员用のgetField或者getDeclaredField 
        。フィールドフィールド= person.getClass()のgetField( "名前" ); 
        field.set(人、 "grahamliu" ); 
        System.out.println(field.get(人)); 

        //非パブリックメンバーにアクセスする必要がありますgetDeclaredField 
        フィールド、フィールド1 = person.getClass()getDeclaredField( "セックス。" ); 
        Field1.set(人、 "女性" ); 
        System.out.printlnは(field1.get(人)); 

        フィールド、フィールド2   person.getClass =()getDeclaredField( "省。" ); 
        field2.set(人、 "南極" ); 
        System.out.printlnは(field2.get(人)); 

        // アクセスおよび修正プライベート変数、あなたはsetAccessibleを設定する必要があります真である 
        フィールド、フィールド3 = person.getClass()getDeclaredField( "年齢" ;)
        field3.setAccessible(真の); 
        field3.set(人、 87);
        System.out.println(field3.get(人)); 

        // プライベート変数クラスへのアクセス、setAccessible設けることなく 
        フィールドを、TestClassを=フィールド4。クラス .getDeclaredField( "CC" ); 
        System.out.printlnは(field4.get(新新TestClassを())); 
    } 
}

印刷:

/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/bin/java「-javaagent:/アプリケーション/ IntelliJのアイディア 
 grahamliu 
南极
 87の
CCCの

終了コードで仕上げプロセス 0

 

知識は二つの点が含まれます。

getFieldまたはgetDeclaredField、非パブリックメンバーへのアクセス1.公共のメンバーはgetDeclaredField必要があります

プライベート変数の2.アクセスや変更はsetAccessibleを設定する必要があり、このクラスを除いて、本当です!

おすすめ

転載: www.cnblogs.com/u1s1/p/12435859.html