Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

AbstractAnnotationAJ.java 3.4KB

15 роки тому
15 роки тому
14 роки тому
15 роки тому
14 роки тому
15 роки тому
15 роки тому
14 роки тому
15 роки тому
15 роки тому
15 роки тому
14 роки тому
15 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /* *******************************************************************
  2. * Copyright (c) 2008 Contributors
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. *
  9. * ******************************************************************/
  10. package org.aspectj.weaver;
  11. import java.util.Collections;
  12. import java.util.Iterator;
  13. import java.util.Set;
  14. public abstract class AbstractAnnotationAJ implements AnnotationAJ {
  15. protected final ResolvedType type;
  16. private Set<String> supportedTargets = null; // @target meta annotation
  17. public AbstractAnnotationAJ(ResolvedType type) {
  18. this.type = type;
  19. }
  20. /**
  21. * {@inheritDoc}
  22. */
  23. public final ResolvedType getType() {
  24. return type;
  25. }
  26. /**
  27. * {@inheritDoc}
  28. */
  29. public final String getTypeSignature() {
  30. return type.getSignature();
  31. }
  32. /**
  33. * {@inheritDoc}
  34. */
  35. public final String getTypeName() {
  36. return type.getName();
  37. }
  38. /**
  39. * {@inheritDoc}
  40. */
  41. public final boolean allowedOnAnnotationType() {
  42. ensureAtTargetInitialized();
  43. if (supportedTargets.isEmpty()) {
  44. return true;
  45. }
  46. return supportedTargets.contains("ANNOTATION_TYPE");
  47. }
  48. /**
  49. * {@inheritDoc}
  50. */
  51. public final boolean allowedOnField() {
  52. ensureAtTargetInitialized();
  53. if (supportedTargets.isEmpty()) {
  54. return true;
  55. }
  56. return supportedTargets.contains("FIELD");
  57. }
  58. /**
  59. * {@inheritDoc}
  60. */
  61. public final boolean allowedOnRegularType() {
  62. ensureAtTargetInitialized();
  63. if (supportedTargets.isEmpty()) {
  64. return true;
  65. }
  66. return supportedTargets.contains("TYPE");
  67. }
  68. /**
  69. * {@inheritDoc}
  70. */
  71. public final void ensureAtTargetInitialized() {
  72. if (supportedTargets == null) {
  73. AnnotationAJ atTargetAnnotation = retrieveAnnotationOnAnnotation(UnresolvedType.AT_TARGET);
  74. if (atTargetAnnotation == null) {
  75. supportedTargets = Collections.emptySet();
  76. } else {
  77. supportedTargets = atTargetAnnotation.getTargets();
  78. }
  79. }
  80. }
  81. /**
  82. * {@inheritDoc}
  83. */
  84. public final String getValidTargets() {
  85. StringBuilder sb = new StringBuilder();
  86. sb.append("{");
  87. for (Iterator<String> iter = supportedTargets.iterator(); iter.hasNext();) {
  88. String evalue = iter.next();
  89. sb.append(evalue);
  90. if (iter.hasNext()) {
  91. sb.append(",");
  92. }
  93. }
  94. sb.append("}");
  95. return sb.toString();
  96. }
  97. /**
  98. * {@inheritDoc}
  99. */
  100. public final boolean specifiesTarget() {
  101. ensureAtTargetInitialized();
  102. return !supportedTargets.isEmpty();
  103. }
  104. /**
  105. * Helper method to retrieve an annotation on an annotation e.g. retrieveAnnotationOnAnnotation(UnresolvedType.AT_TARGET)
  106. */
  107. private final AnnotationAJ retrieveAnnotationOnAnnotation(UnresolvedType requiredAnnotationSignature) {
  108. AnnotationAJ[] annos = type.getAnnotations();
  109. for (AnnotationAJ a : annos) {
  110. if (a.getTypeSignature().equals(requiredAnnotationSignature.getSignature())) {
  111. return a;
  112. }
  113. }
  114. return null;
  115. }
  116. /**
  117. * {@inheritDoc}
  118. */
  119. public abstract boolean isRuntimeVisible();
  120. /**
  121. * {@inheritDoc}
  122. */
  123. public abstract Set<String> getTargets();
  124. /**
  125. * {@inheritDoc}
  126. */
  127. public abstract boolean hasNameValuePair(String name, String value);
  128. /**
  129. * {@inheritDoc}
  130. */
  131. public abstract boolean hasNamedValue(String name);
  132. /**
  133. * {@inheritDoc}
  134. */
  135. public abstract String stringify();
  136. }