Это возможное записать интерфейс Marker

Я прошел следующее учебное руководство:

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

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

Исправьте меня, если я неправ. аплодисменты:)

8
задан Joachim Sauer 27 January 2010 в 12:08
поделиться

5 ответов

Здесь тег - это десятичный код Hexa AC ED, который добавляется в файл .class этого класса, который реализует сериализуемый интерфейс. Итак, что JVM обрабатывает этот класс файл особым способом (может быть некоторая работа в тяжелых распределении ресурсов), потому что экземпляр этого класса может быть сериализован. Для нормальных классов добавляет Ca Fe Hex.

Ага !! Я понимаю вашу путаницу.

  • CA FE Волшебный номер для файла Bytecode; I.e. Файл, который вы получаете, когда вы компилируете класс. Файл Bytecode для любого класса имеет этот магический номер, будь то сериализен или не сериализуется.

  • AC ED - это волшебный номер сериализованный объектный файл Java; I.e. Файл вы сериализуете экземпляр некоторых сериализуемых классов.

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

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

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

14
ответ дан 5 December 2019 в 06:09
поделиться
package com.example;
interface MarkerInterface {}

Здесь у вас есть один. Просто copypste это в COM / EMER / MARKERINTERFACE.java , компилируйте и используйте его!

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

class SomeClass implements MarkerInterface {
    // ...
}
3
ответ дан 5 December 2019 в 06:09
поделиться

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

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

8
ответ дан 5 December 2019 в 06:09
поделиться

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

0
ответ дан 5 December 2019 в 06:09
поделиться

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

Однако использование интерфейсов маркеров таким образом, как правило, не препятствует теперь, чтобы мы имели аннотации . Методы маркировки классов и полей различных способов для последующей обработки при компиляции время с использованием инструмента обработки аннотации (APT) или во время выполнения с использованием отражения - какие аннотации были созданы для.

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

class MyClass implements MyMarkerInterface {
}

Вы, вероятно, должны создать аннотацию и использовать его так:

@MyAnnotation
class MyClass {
}
2
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

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