2016-03-18 3 views
2

のサブクラスに静的クラスのprotectedメンバにアクセスするクラスExtendedDismaxQParserは、静的メンバクラスの句を持っています

public class ExtendedDismaxQParser { 
    protected static Class Clause { 
     protected String foo, bar; 
    } 
    public Clause getAClause { 
     Clause c; 
     // misc code that isn't important 
     return c; 
    } 
} 

が、私はその後、別のパッケージに、このクラスを拡張:

public class SpecialDismaxQParser extends ExtendedDismaxQParser { 
    public void whatever() { 
     Clause c = super.getAClause(); 
     boolean baz = c.foo.equals("foobar"); // <-- This doesn't compile 
    } 
} 

をに見えますクラスClauseが保護されていて、メンバ変数fooも保護されているにもかかわらず、fooメンバ変数にアクセスできないようです。

私は、保護された静的クラス句のメンバ変数fooについて何かをチェックできるようにしたいだけです。どのようにすればよいですか?

親クラスはライブラリの一部であるため、変更する必要はありません。

+0

を通じて、残念ながらです。ここに良い参考表があります:http://stackoverflow.com/a/33627846/276052 – aioobe

+0

http://stackoverflow.com/questions/14534421/java-extending-inner-classesを見てください。 – bradimus

+0

私は答えを書いたが、私のインターネットは消えてしまい、それは削除されているようだ。基本的には、内部クラスのサブクラス(および同じパッケージ内の他の場所)でのみ表示されるため、フィールドを 'public'にします。 – bcsb1001

答えて

-2

保護されたアクセス修飾子を使用すると、パッケージ内でのみ変数とメソッドにアクセスできます。 Clauseクラスのパッケージ内にクラスを作成する必要があります。

ここでリフレクションはうまくいかないでしょう。

+0

パッケージプライベートアクセスと混同していませんか? – aioobe

+0

投票前にGoogleのJavaアクセス修飾子を使用する – rahsan

+0

@rahsan誤った答えを投稿する前にGoogle Javaアクセス修飾子を使用するだけです。 'protected'アクセスはサブクラスにも適用されます。 – bcsb1001

1

aioobeさんのコメントは正しくありません。

外部クラスでスーパークラスを共有するだけでは、静的内部クラスの保護されたメンバーにアクセスするには不十分です。

呼び出し元のクラスはClauseを拡張せず、別のパッケージに含まれています。 protectedを関連付けるには、Clauseのサブクラス内からfooにアクセスするか、ExtendedDismaxQParserと同じパッケージ内のクラスからアクセスする必要があります。

0

@Nathan Hughes氏のコメントですでに説明したように、protectedフィールドはClauseにはアクセスできません。拡張されるクラスではありません。

このフィールドにアクセスする唯一の方法は、句が拡張されているクラスではないので、これは反射

public class SpecialDismaxQParser extends ExtendedDismaxQParser { 
    public void whatever() { 
     try { 
      Field fooField = Clause.class.getDeclaredField("foo"); 
      fooField.setAccessible(true); 
      Clause c = super.getAClause(); 
      boolean baz = fooField.get(c).equals("foobar"); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 
}