- ベストアンサー
クラス内のメンバ変数について
クラス内のメンバ変数について Javaで作成したクラスのメンバ変数なのですが、クラス内のメンバ変数名の 一覧を取得する方法を探しています。 昔、仕事でやったような気がするのですが、忘れていました。 やりたいことは、メンバ変数のString型のメンバにtrimを行いたいのですが、 一つずつ名称を指定したくなく、どのクラスでも共通処理を行いたいです。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
http://ideone.com/OLp6X ●一応reflectionなるもので、クラスに関する情報を取得することは可能である。 ●リファレンス読んでもらえればわかるが、上記のコードはPublicなフィールドのみを対象としている。 ●getDeclaredFieldsというメソッドもあるようだが、そのまま書き換えてもセキュリティではねられるようで、ポリシーファイルを書かないとダメらしい。検証するのが面倒だし、以前やったことがあるということはそれなりの経験者だろうから回答はこんなもんでも自力で調べてもらえるだろう。 ●もちろん上記のコードはString型のフィールドをとってきているんじゃくてString型に含まれるフィールドの列挙で、ひとつしかないからひとつしか表示されない。寂しい。
その他の回答 (1)
- kenichiice
- ベストアンサー率72% (27/37)
> ただ、うまく行ったのですが、TestSuperクラスのtAにまで > 参照している(fields[]の中にtAも含まれているようです)ようなのですが、 > TestSubクラスのみを対象にすることは可能でしょうか? Class#getDeclaredFields() の説明には http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Class.html#getDeclaredFields%28%29 「これには、public、protected、デフォルト (package) アクセス、および private フィールドは含まれますが、継承フィールドは含まれません。」とあるので、TestSuperクラスのフィールドは返されないはずです。 私も試してみましたが、tAは含まれていませんでした。なので、示されたコードのように Class#getDeclaredFields() を使っているのであれば、何か勘違いをされているのではないかと思います。
お礼
ありがとうございます。 すみません。私の勘違いでした。 (デバッカにて)見ている箇所を間違っていました。 確認までして頂いてありがとうございました。
お礼
ありがとうございます。 すみません。私の勘違いでした。 (デバッカにて)見ている箇所を間違っていました。
補足
ありがとうございました。 頂いた情報を元に以下の記述でうまくいきました。 public class TestSuper { private String tA; public void trim() { Field fields[] = this.getClass().getDeclaredFields(); try{ for (int i = 0; i < fields.length; i++) { String type = fields[i].getType().getName(); if("java.lang.String".equals(type)){ fields[i].setAccessible(true); String obj = (String)fields[i].get(this); if(obj != null){ fields[i].set(this,obj.trim()); } } } }catch(Exception e){ } } } public class TestSub extends TestSuper { private String sA; private String sB; } ※Getter,Setterは記述している前提。 TestSub sub = new TestSub(); sub.setSA("aaaa "); sub.trim(); System.out.println("[" + sub.getSA() + "]"); ただ、うまく行ったのですが、TestSuperクラスのtAにまで 参照している(fields[]の中にtAも含まれているようです)ようなのですが、 TestSubクラスのみを対象にすることは可能でしょうか?