2016-03-18 6 views
2

Класс 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 
    } 
} 

Он выглядит например, вы не можете получить доступ к переменной-члену foo, несмотря на то, что класс Clause защищен, а переменная-член foo также защищена.

Я просто хочу проверить что-то о переменной-члене foo защищенного статического класса Clause. Как я могу это сделать (желательно без отражения)?

Я бы предпочел не изменять родительский класс, потому что он является частью библиотеки.

+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 Просто модификаторы доступа Java Java до публикации неправильного ответа. Доступ с защитой также применяется к подклассам. – bcsb1001

1

Комментарий aioobe является правильным.

Совместное использование суперкласса с внешним классом недостаточно для доступа к защищенным членам статического внутреннего класса.

Класс вызывающего абонента не распространяется на предложение и находится в другом пакете. Для того, чтобы иметь значение protected, вам нужно будет получить доступ к 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(); 
     } 
    } 
}