|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Следующие темы затрагиваются
Инструмент apt и его связанный API, содержавшийся в пакете, com.sun.mirror был осужден начиная с JDK 7 и планируется, чтобы быть удаленным в следующем главном выпуске JDK. Используйте опции, доступные в инструменте javac и API, содержавшихся в пакетах javax.annotation.processing и javax.lang.model обработать аннотации.
Следующие таблицы суммируют apt Замены API:
apt ввести |
Стандартная Замена |
|---|---|
AnnotationProcessor |
javax.annotation.processing.Processor |
AnnotationProcessorEnvironment |
javax.annotation.processing.ProcessingEnvironment |
AnnotationProcessorFactory |
javax.annotation.processing.Processor |
AnnotationProcessorListener |
Никакой аналог. |
AnnotationProcessors |
Никакой аналог. |
Filer |
javax.annotation.processing.Filer |
Filer.Location |
javax.tools.StandardLocation |
Messager |
javax.annotation.processing.Messager |
RoundCompleteEvent |
Никакой аналог. |
RoundCompleteListener |
Никакой аналог. |
RoundState |
javax.annotation.processing.RoundEnvironment |
apt ввести |
Стандартная Замена |
|---|---|
AnnotationMirror |
javax.lang.model.element.AnnotationMirror |
AnnotationTypeDeclaration |
javax.lang.model.element.TypeElement |
AnnotationTypeElementDeclaration |
javax.lang.model.element.ExecutableElement
|
AnnotationValue
|
javax.lang.model.element.AnnotationValue
|
ClassDeclaration
|
javax.lang.model.element.TypeElement
|
ConstructorDeclaration
|
javax.lang.model.element.ExecutableElement
|
Declaration
|
javax.lang.model.element.Element
|
EnumConstantDeclaration
|
javax.lang.model.element.VariableElement
|
EnumDeclaration
|
javax.lang.model.element.TypeElement
|
ExecutableDeclaration
|
javax.lang.model.element.ExecutableElement
|
FieldDeclaration
|
javax.lang.model.element.VariableElement
|
InterfaceDeclaration
|
javax.lang.model.element.TypeElement
|
MemberDeclaration
|
javax.lang.model.element.Element
|
MethodDeclaration
|
javax.lang.model.element.ExecutableElement
|
Modifier
|
javax.lang.model.element.Modifier
|
PackageDeclaration
|
javax.lang.model.element.PackageElement
|
ParameterDeclaration
|
javax.lang.model.element.VariableElement
|
TypeDeclaration
|
javax.lang.model.element.TypeElement
|
TypeParameterDeclaration
|
javax.lang.model.element.TypeParameterElement
|
apt ввести |
Стандартная Замена |
|---|---|
AnnotationType
|
javax.lang.model.type.DeclaredType
|
ArrayType
|
javax.lang.model.type.ArrayType
|
ClassType
|
javax.lang.model.type.DeclaredType
|
DeclaredType
|
javax.lang.model.type.DeclaredType
|
EnumType
|
javax.lang.model.type.DeclaredType
|
InterfaceType
|
javax.lang.model.type.DeclaredType
|
MirroredTypeException
|
javax.lang.model.type.MirroredTypeException
|
MirroredTypesException
|
javax.lang.model.type.MirroredTypesException
|
PrimitiveType
|
javax.lang.model.type.PrimitiveType
|
PrimitiveType.Kind
|
javax.lang.model.type.TypeKind
|
ReferenceType
|
javax.lang.model.type.ReferenceType
|
TypeMirror
|
javax.lang.model.type.TypeMirror
|
TypeVariable
|
javax.lang.model.type.TypeVariable
|
VoidType
|
javax.lang.model.type.NoType
|
WildcardType
|
javax.lang.model.type.WildcardType
|
apt ввести |
Стандартная Замена |
|---|---|
DeclarationFilter
|
javax.lang.model.util.ElementFilter
|
DeclarationScanner
|
javax.lang.model.util.ElementScanner6
|
DeclarationVisitor
|
javax.lang.model.element.ElementVisitor
|
DeclarationVisitors
|
Никакая замена. |
Declarations
|
javax.lang.model.util.Elements
|
SimpleDeclarationVisitor
|
javax.lang.model.util.SimpleElementVisitor6
|
SimpleTypeVisitor
|
javax.lang.model.util.SimpleTypeVisitor6
|
SourceOrderDeclScanner
|
javax.lang.model.util.SimpleElementVisitor6
|
SourcePosition
|
Никакая замена. |
TypeVisitor
|
javax.lang.model.element.TypeVisitor
|
Types
|
javax.lang.model.util.Types
|
apt, инструмент обработки аннотации, находит и выполняет процессоры аннотации, основанные на аннотациях, существующих в наборе указанных исследуемых исходных файлов. Процессоры аннотации используют ряд отражающих API и инфраструктуры поддержки, чтобы выполнить их обработку аннотаций программы (). apt отражающие API обеспечивает разовое сборкой, основанное на источнике, представление только для чтения структуры программы. Эти отражающие API разрабатываются, чтобы чисто смоделировать систему типов языка программирования JavaTM после добавления обобщений (). Во-первых, apt процессоры аннотации выполнений, которые могут произвести новый исходный код и другие файлы. Затем, apt может вызвать компиляцию и исходных и сгенерированных исходных файлов, таким образом ослабляя цикл разработки. По сравнению с использованием doclet, чтобы генерировать полученные файлы, основанные на аннотациях, apt
Экземпляр процессора возвращается его соответствующей фабрикой - AnnotationProcessorFactory. Инструмент apt вызывает метод getProcessorFor фабрики, чтобы овладеть процессором. Во время этого вызова инструмент обеспечивает AnnotationProcessorEnvironment. В среде процессор найдет все, что это должно начать, включая ссылки на структуру программы, на которой это работает, и средства связаться и сотрудничать с инструментом apt, создавая новые файлы и передавая предупреждающие сообщения и сообщения об ошибках.
Есть два способа, которыми может быть найдена фабрика; фабрика, чтобы использовать может быть определена через параметр командной строки "-factory", или фабрика может быть расположена во время процедуры открытия apt. Используя "-factory" опция является самым простым способом выполнить единственную известную фабрику; эта опция может также использоваться, когда фабрика нуждается в большем количестве управления тем, как это выполняется. Чтобы определить местоположение фабрик на определенном пути, процедура открытия получает от файлов фляги информацию о META-INF/services в формате, описанном ниже.
Создать и использовать процессор аннотации, используя опцию "-factory":
import com.sun.mirror.apt.*;
import com.sun.mirror.declaration.*;
import com.sun.mirror.type.*;
import com.sun.mirror.util.*;
import java.util.Collection;
import java.util.Set;
import java.util.Arrays;
import static java.util.Collections.*;
import static com.sun.mirror.util.DeclarationVisitors.*;
/*
* This class is used to run an annotation processor that lists class
* names. The functionality of the processor is analogous to the
* ListClass doclet in the Doclet Overview.
*/
public class ListClassApf implements AnnotationProcessorFactory {
// Process any set of annotations
private static final Collection<String> supportedAnnotations
= unmodifiableCollection(Arrays.asList("*"));
// No supported options
private static final Collection<String> supportedOptions = emptySet();
public Collection<String> supportedAnnotationTypes() {
return supportedAnnotations;
}
public Collection<String> supportedOptions() {
return supportedOptions;
}
public AnnotationProcessor getProcessorFor(
Set<AnnotationTypeDeclaration> atds,
AnnotationProcessorEnvironment env) {
return new ListClassAp(env);
}
private static class ListClassAp implements AnnotationProcessor {
private final AnnotationProcessorEnvironment env;
ListClassAp(AnnotationProcessorEnvironment env) {
this.env = env;
}
public void process() {
for (TypeDeclaration typeDecl : env.getSpecifiedTypeDeclarations())
typeDecl.accept(getDeclarationScanner(new ListClassVisitor(),
NO_OP));
}
private static class ListClassVisitor extends SimpleDeclarationVisitor {
public void visitClassDeclaration(ClassDeclaration d) {
System.out.println(d.getQualifiedName());
}
}
}
}
Много новых языков и функций библиотеки используются в демонстрационном процессоре. Во-первых, импорт static используется так, чтобы простое имя различных служебных методов могло использоваться; например
"unmodifiableCollection"
вместо
"Collections.unmodifiableCollection".
Во-вторых, универсальные наборы используются повсюду. Метод Arrays.asList является теперь методом var-args, таким образом, он может принять список разделенных запятой значений строк и создать список с требуемыми элементами. Метод Collections.emptySet является универсальным методом и может использоваться, чтобы создать безопасное с точки зрения типов пустое множество. Цикл for в методе процесса является улучшенным циклом for, который может выполнить итерации по наборам.
Инструмент apt дарит фабрике ряд аннотаций для фабрики, чтобы обработать. Основанный на наборе аннотаций и среды процессора аннотации, фабрика возвращает единственный процессор аннотации. Что, если фабрика хочет возвратить многократные процессоры аннотации? Фабрика может использовать com.sun.mirror.apt.AnnotationProcessors.getCompositeAnnotationProcessor, чтобы объединить и упорядочить работу многократных процессоров аннотации.
apt определенные опции:
Если класс фабрики используется больше чем одним раундом обработки аннотации, класс фабрики загружается однажды, и однажды метод getProcessorFor фабрики вызовут на раунд. Это позволяет фабрике хранить статическое состояние через раунды.
Если опция -factory используется, именованная фабрика является единственной запрошенной.
Зеркальный API представляет конструкции исходного кода преимущественно через интерфейс Declaration и его иерархию подынтерфейсов в пакете com.sun.mirror.declaration. Declaration представляет элемент программы, такой как пакет, класс, или метод, и обычно соответствует непосредственный определенному фрагменту исходного кода. Declarations является структурами, которые могут быть аннотированы.
Типы представляются интерфейсом TypeMirror и его иерархией подынтерфейсов в пакете com.sun.mirror.type. Типы включают типы примитивов, класс и интерфейсные типы, выстраивают типы, вводят переменные, и подстановочные типы.
API делает все возможное различить объявления и типы. Это старше значащее для универсальных типов, где единственное объявление может определить всю семью типов. Например, объявление класса java.util.Set соответствует
TypeMirror s используется, чтобы смоделировать типы возврата, типы параметра, и т.д., в исходном коде. TypeMirror для ссылочного типа обеспечивает отображение от типа до соответствующего объявления; например от типа зеркально отражают для java.util.Set<String> к объявлению для java.util.Set.