Как java.lang. Защищенные методы объекта защищены от подклассов?

Я новичок в Spring Boot, поэтому вопрос о том, является ли это правильным подходом к решению этой проблемы, еще предстоит выяснить, однако вопрос

«Как выполнить код до или после события crud» 112]

Для ответа используются события, которые запускаются экспортером REST во время операций CRUD.

Документацию можно найти здесь

12
задан Adrian Heine 16 January 2009 в 19:32
поделиться

3 ответа

Можно только получить доступ к защищенным членам типа в другом пакете, если тип времени компиляции выражения, Вы ссылаетесь на него через, является или Вашим собственным классом или подклассом. (Где "Ваш" класс является классом, содержащим код.) Ваш собственный класс должен быть подклассом типа, который первоначально объявляет метод, также.

Вот пример; примите это Base находится в другом пакете ко всем другим классам:

package first;
public class Base
{
    protected void Foo() {}
}

// Yes, each class is really in its own file normally - but treat
// all the classes below as being in package "second"

package second;
public class Child extends Base
{
    public void OtherMethod(Object x)
    {
        ((Base) x).Foo(); // Invalid: Base is not Child or subclass
        ((Child) x).Foo(); // Valid: Child is Child
        ((GrandChild) x).Foo(); // Valid: GrandChild is subclass of Child
        ((OtherChild) x).Foo(); // Invalid: OtherChild is not Child or subclass
    }
}

public class GrandChild extends Child {}
public class OtherChild extends Base {}

Другими словами, это позволяет Вам иметь доступ к защищенным членам "объектов, которые являются подобным Вы".

Детали находятся в разделе 6.6.2 из Спецификации языка Java:

A protected к участнику или конструктору объекта можно получить доступ снаружи пакета, в котором он объявляется только кодом, который ответственен за реализацию того объекта.

6.6.2.1 Доступ к защищенному участнику

Позвольте C быть классом, в котором объявляется защищенный участник m. Доступ разрешен только в теле подкласса S C. Кроме того, если идентификатор обозначает поле экземпляра или метод экземпляра, то: Если доступом является полностью определенным именем Q.Id, где Q является ExpressionName, то доступ разрешен, если и только если тип выражения Q является S или подклассом S. Если доступом является по выражению доступа к полю E.Id, где E является Первичное выражение, или по выражению вызова метода E.Id (...), где E является Первичное выражение, затем доступ разрешен, если и только если тип E является S или подклассом S.

16
ответ дан 2 December 2019 в 07:04
поделиться

Различие - то, как Вы получаете доступ к Object.clone (). клон только доступен при доступе через sub класс или класс в том же пакете. В getOne () пример Вы - claling this.clone (). Это ясно удовлетворяет доступ из sub класса.

В getTwo (), хотя Вы получаете доступ к Object.clone () и не TestClass.clone (). Для этого для работы у Вас должен быть доступ уровня пакета для Возражения, который Вы не делаете и следовательно ошибка.

1
ответ дан 2 December 2019 в 07:04
поделиться

Когда Вы сказали"((Object) this).clone()", Вы получили доступ к своему собственному объекту через его суперобъект класса. Вы выполнили расширяющееся преобразование в Объект. Код затем пытается назвать клон на Объекте.

Но, поскольку Вы отметили, клон является защищенным методом, означая, что, только если Ваш объект был в том же пакете java.lang, будет он смочь получить доступ к методу клона ОБЪЕКТА.

Когда Вы говорите, что this.clone, Ваш класс расширенный Объект и таким образом имел доступ к переопределению, или используйте клон непосредственно через модификатор защищенного класса из-за наследования. Но это не изменяет Реализацию объектов.

Путем высказывания ((Объект) yourObject), Вы получаете что-то, что только доступно через Класс объекта. Только открытые методы Класса объекта являются доступным озидом пакета java.lang, таким образом, Вы получаете исключение времени компиляции, потому что компилятор знает это.

Путем высказывания this.clone (), Вы вызываете метод клона своего объекта, что он прошел через наследование через Объект и теперь может быть вызванным, потому что это становится частью Вашего пользовательского подкласса.

5
ответ дан 2 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: