17

ゲッターとセッターを備えた2つのPOJOクラスがあります。現在、そのクラスのすべてのクラスインスタンス変数を取得しようとしています。

どうやってリフレクションを使うことができるのか知りましたか?

これは、リフレクションクラスを拡張するPOJOクラスです。

class Details{

private int age;
private String name;

}

リフレクションクラスは次のようなものです。

class Reflection{

public String toString(){

return all the fields of that class
}
4

4 に答える 4

41

あなたはこのようなことをすることができます:

public void printFields(Object obj) throws Exception {
    Class<?> objClass = obj.getClass();

    Field[] fields = objClass.getFields();
    for(Field field : fields) {
        String name = field.getName();
        Object value = field.get(obj);

        System.out.println(name + ": " + value.toString());
    }
}

これはパブリックフィールドのみを印刷し、プライベートフィールドを印刷するにはclass.getDeclaredFieldsを再帰的に使用します。

または、クラスを拡張する場合:

public String toString() {
    try {
        StringBuffer sb = new StringBuffer();
        Class<?> objClass = this.getClass();

        Field[] fields = objClass.getFields();
        for(Field field : fields) {
            String name = field.getName();
            Object value = field.get(this);

            sb.append(name + ": " + value.toString() + "\n");
        }

        return sb.toString();
    } catch(Exception e) {
        e.printStackTrace();
        return null;
    }
}
于 2013-02-27T12:58:19.427 に答える
2
    ClassLoader classLoader = Main.class.getClassLoader();
    try {
        Class cls = classLoader.loadClass("com.example.Example");
        Object clsObject = cls.newInstance();

        Field[] fields = cls.getFields();
        for (Field field : fields) {
            String name = field.getName();
            Object value = field.get(clsObject);

            System.out.println("Name : "+name+" Value : "+value);

        }
        System.out.println(cls.getName());


    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
于 2017-01-08T20:09:25.620 に答える
2

上記のコードにもう1行追加します。クラスのプライベートプロパティにアクセスする場合は、以下の行を使用してください

field.setAccessible(true);

于 2017-03-15T09:40:45.100 に答える
1

上記の解決コードまたは回答には1つの問題があります。プライベート変数の値にアクセスするには、アクセスタイプをtrueに設定する必要があります

Field[] fields = objClass.getDeclaredFields();
for (Field field : fields) {
    NotNull notNull = field.getAnnotation(NotNull.class);
    field.setAccessible(true);
}

それ以外の場合はスローされjava.lang.IllegalAccessExceptionます。クラスリフレクションは、修飾子「private」を使用してクラスDetailsのメンバーにアクセスできません

于 2016-08-27T04:10:13.183 に答える