2017-12-12 7 views
2

私は以下の汎用関数を複数のクラスから使いたいと思います。問題は、これをヘルパークラスから呼び出すと、可視性のためにフィールドオブジェクトを取得できないということです。ヘルパークラスのフィールドのJavaリフレクション

public <T> List<T> descendingServices(Class<T> cls) { 
    List<T> descendings = new ArrayList<>(); 

    for (Field field : EnvironmentServiceImpl.class.getDeclaredFields()) { 
    Object obj; 
    try { 
     obj = field.get(this); 
     if (cls.isInstance(obj)) { 
     T descending = (T) obj; 
     descendings.add(descending); 
     } 
    } catch (IllegalAccessException e) { 
    } 
    } 

    return descendings; 
} 

フィールドでsetAccessibleを使用せずに何らかの形で回避できますか?

+0

nope。 Edit:新しいオブジェクトを取得するように見えるので、元に戻す必要はありません。 –

+0

参照:https://stackoverflow.com/questions/10638826/java-reflection-impact-of- setaccessibletrue –

答えて

1

解決策は、最初にリフレクションを使用していなかった場合に、どのようにフィールドにアクセスするかを考えることです。次に、データにアクセスする方法を理解した後でリフレクションコードを追加できます。

publicではないためにフィールドにアクセスできない場合は、フィールドを宣言したクラスは、フィールドにアクセスするゲッタメソッドpublicを宣言し、カプセル化を提供します。

必要に応じて、ゲッターメソッドをクラスに追加します。次にgetDeclaredFieldsの代わりにClassgetMethodsメソッドを呼び出します。処理したくない他の方法をバイパスする必要があるかもしれません。 Javadocs for getMethodsから

クラスまたはインタフェースが宣言したものとスーパークラスから継承されたものを含む本Classオブジェクトが表すクラスまたはインタフェースのすべてのパブリックメソッドを反映Methodオブジェクトを含有し、配列を返しますスーパーインタフェース。

関連する問題