Вопрос

Я прошел следующий урок:

http://www.javaworld.com/community/node/2915

И после прочтения приведенной выше статьи, я чувствую, что невозможно написать интерфейс маркера, потому что, как вы можете проинструктировать компилятор, что, какой тег, он встроен в файл .class для вашего интерфейса маркера.

Пожалуйста, поправьте меня, если я ошибаюсь.ваше здоровье :)

Это было полезно?

Решение

здесь тег представляет собой шестнадцатеричный код AC ED, который добавляется в файл .class того класса, который реализует интерфейс Serializable.Таким образом, JVM обрабатывает этот файл класса особым образом (это может быть тяжелая работа по распределению ресурсов), поскольку экземпляр этого класса может быть сериализован.Для обычных классов добавляется шестнадцатеричный код CA FE.

Ага!!Я понимаю ваше замешательство.

  • CA FE магическое число файла байт-кода;то естьфайл, который вы получаете при компиляции класса.Файл байт-кода для ЛЮБОГО класса имеет этот магический номер, независимо от того, сериализуем он или нет.

  • AC ED — магическое число сериализованного объектного файла Java;то естьфайл, в котором вы сериализуете экземпляр некоторого сериализуемого класса.

Вы путаете две разные концепции (классы и экземпляры) и их соответствующие представления.

Итак, ответ на ваш вопрос...конечно, вы можете написать свои собственные интерфейсы маркеров!Для компилятора нет ничего особенного в классе, реализующем интерфейс маркера.

Однако это бы невозможно дублировать реализацию десериализации объектов Java в чистой Java.Десериализация объекта использует бэкдор ( Unsafe.allocateInstance метод) для создания объектов без вызова их конструкторов.AFAIK, этот метод нельзя вызвать из обычного кода Java.(А даже если и может, то не должно быть...)

Другие советы

Конечно, вы можете написать интерфейс маркера.Интерфейс маркера обычно представляет собой просто интерфейс без каких-либо методов (поэтому его может реализовать любой класс).

Кажется, вы думаете, что интерфейсы маркеров обладают какими-то магическими свойствами, которые что-то делают сами по себе.Это не так.Вместо этого некоторые другой код может реагировать на наличие интерфейса маркера на каком-либо объекте и действовать по-разному, когда класс его реализует.Но сам интерфейс маркера ничего не делает .

package com.example;
interface MarkerInterface {}

Вот он у вас есть.Просто скопируйте это в com/example/MarkerInterface.java, скомпилируйте и используйте!

Вот пример использования:

class SomeClass implements MarkerInterface {
    // ...
}

Вы не можете создать интерфейс маркера, который будет иметь значение для JVM, например java.io.Serializable интерфейс делает.Однако вы можете создать интерфейс маркера, который вы проверяете в своем собственном коде, используя instanceof.

Однако теперь, когда у нас есть аннотации.Маркировка методов и полей класса различными способами для последующей обработки во время компиляции с помощью Инструмент обработки аннотаций (apt) или во время выполнения с использованием отражения — это то, для чего были созданы аннотации.

Поэтому вместо того, чтобы создавать интерфейс маркера и использовать его следующим образом:

class MyClass implements MyMarkerInterface {
}

Вероятно, вам следует создать аннотацию и использовать ее следующим образом:

@MyAnnotation
class MyClass {
}

Зависит от того, что вы понимаете под интерфейсом маркера.Но в целом вы можете использовать instanceof в своем коде, чтобы проверить, реализует ли экземпляр интерфейс Marker, а затем что-то сделать с этим экземпляром...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top