JAva反射親属性の値を取得する

7937 ワード

クラスに遭遇し、setメソッドが書かれ、getメソッドが書かれていないため、そのサブクラスは親クラスのプロパティを呼び出すことができません.のコードを変更できないため、反射メカニズムで属性の値を取得しました.のデバッグ時に、テスト用にいくつかのクラスを自分で作成し、以下に整理します.
親:
package date0415.pm. ;

public class TestParent{

    private String str1="www";// 。
    private String str2="hao123";// 。
    private int int1;

    public TestParent() {
        super();
    }
    public TestParent(String str1, String str2,int int1) {
        super();
        this.str1 = str1;
        this.str2 = str2;
        this.int1 = int1;
    }

    /** *  ,  */
    public void print(){
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(int1);
    }
}

サブクラス:
package date0415.pm. ;

import java.lang.reflect.Field;

public class TestChild extends TestParent{

        public TestChild() {
            super();
        }
        public TestChild(String str1, String str2, int mVerticalSpacing) {
            super(str1, str2, mVerticalSpacing);
        }

        /** *  ( ) */
        public Object getSpecificedFieldObject(String fieldName) {
            Class<?> clazz = this.getClass().getSuperclass();
                Object object = null;
                try {
                    Field field = clazz.getDeclaredField(fieldName);
                    field.setAccessible(true);
                    object = field.get(this);
                }
                catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }
                catch (SecurityException e) {
                    e.printStackTrace();
                } 
                catch (IllegalArgumentException e) {
                    e.printStackTrace();
                }
                catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            return object;

        }
}

主メソッドクラス:
package date0415.pm. ;

public class TestMain{

    public static void main(String[] args){
        // TestParent t=new TestParent();
        // t.print();
        // 
        // Field[] f = t.getClass().getDeclaredFields();
        //
        // for(int i=0;i<f.length;i++){
        // f[i].setAccessible(true);
        // if (f[i].getName() == "str2") {
        // f[i].set(t, "japan"); 
        // };
        // }
        // t.print();
        test1();
        System.out.println("

--------- --------

"
); test2(); } /** * 1 */ private static void test1(){ TestChild child = new TestChild(); String v1 = (String) child.getSpecificedFieldObject("str1"); String v2 = (String) child.getSpecificedFieldObject("str2"); int v3 = (int) child.getSpecificedFieldObject("int1"); System.out.println(" :"); System.out.println("str1 = "+v1); System.out.println("str2 = "+v2); System.out.println("str3 = "+v3); System.out.println("
:"
); child.print();// } /** * 2 */ private static void test2(){ TestChild child = new TestChild(" ", " ", 10086); String v1 = (String) child.getSpecificedFieldObject("str1"); String v2 = (String) child.getSpecificedFieldObject("str2"); int v3 = (int) child.getSpecificedFieldObject("int1"); System.out.println(" :"); System.out.println("str1 = "+v1); System.out.println("str2 = "+v2); System.out.println("str3 = "+v3); System.out.println("
:"
); child.print();// } }

印刷結果は次のとおりです.
str1 = www
str2 = hao123
str3 = 0

 :
www
hao123
0


--------- --------


 :
str1 =  
str2 =  
str3 = 10086

 :
 
 
10086