Java反射オブジェクトのすべての(privateとその親の名前を含む)プロパティ


作業のため、オブジェクトのプロパティのプロパティのプロパティを取得する必要があります.君をだましていない,これは本当だ.もちろん、これは本当に何ではありません.3級の属性呼び出しではありませんか.毎日書いています.私が言いたいのは、この3つの属性のうち、最初の2つは親クラスで有名で、最初はprotectedで、後の2つはprivateです.この3級は、GetterとSetterの1級は提供されていません.また、この3級のコードは、jarパッケージの中にあるので、私は逆コンパイルしてDebugを加えて、これがあることを知っています.通常の呼び出しでは、最初のプロパティは取得されません.
 
この場合、反射することなく、行き詰まってしまいます.もちろん、反射はこのような場所で使うのは、良い選択ではありません.しかし、仕方がありません.プロジェクトは急いでいます.jarパッケージのコードは私には動けません.これは、私は必ず必要です.それがなければだめです.したがって,反射で一時的な解決策しか得られない.
 
くだらないことは言わないで、自分でやってみる過程も、話さないで、最後に走れる例だけを貼ってください.
 
1、Personという親を先に書く
 
 
package com.lippeng.helloworld;

public class Person {
    private String name = "xiaoming";//    ,           ,        
}

2、XiaoMingというサブクラスを書く
 
package com.lippeng.helloworld;

public class XiaoMing extends Person {
    //     ,        ,  。。。
}

3、準備が終わったら、私のHelloWorldを見てください.

package com.lippeng.helloworld;

import java.lang.reflect.Field;

public class HelloWorld {

    public static void main(String[] args) {
	Object object = new XiaoMing();
	String fieldName = "name";

	Object value = getFieldValue(object, fieldName);

	if (value != null) {
	    System.out.println(value);//     ,   ,       "Hello World!",  "xiaoming"。  。。。
	} else {
	    System.out.println("      。。。");
	}

    }

    /**
     * get the field value in aObject by aFieldName
     * 
     * @param aObject
     * @param aFieldName
     * @return
     */
    private static Object getFieldValue(Object aObject, String aFieldName) {
	Field field = getClassField(aObject.getClass(), aFieldName);// get the field in this object
	if (field != null) {
	    field.setAccessible(true);
	    try {
		return field.get(aObject);
	    } catch (Exception e) {
		e.printStackTrace();
		return null;
	    }
	}
	return null;
    }

    /**
     *     ,     ,         
     * 
     * @param aClazz
     * @param aFieldName
     * @return
     */
    private static Field getClassField(Class aClazz, String aFieldName) {
	Field[] declaredFields = aClazz.getDeclaredFields();
	for (Field field : declaredFields) {
	    //   :       ,        。   ,   。     Field。    ,    Class,   getDeclaredField(String fieldName),  ,   
	    if (field.getName().equals(aFieldName)) {
		return field;// define in this class
	    }
	}

	Class superclass = aClazz.getSuperclass();
	if (superclass != null) {//        
	    return getClassField(superclass, aFieldName);
	}
	return null;
    }
}

 
これで終わり?はい、これで終わりです.これらがあれば、上の3レベルのプロパティ呼び出しは、子供の芝居のようです.