2015-07-11 34 views
1

如果我們考慮任何泛型類型,例如,從java.util.Collections採取瞭如下代碼,瞭解角色

static class UnmodifiableCollection<E> implements Collection<E>, Serializable { 
     private static final long serialVersionUID = 1820017752578914078L; 

     final Collection<? extends E> c; 

     UnmodifiableCollection(Collection<? extends E> c) { 
      if (c==null) 
       throw new NullPointerException(); 
      this.c = c; 
     } 

     public int size()     {return c.size();} 
     public boolean isEmpty()   {return c.isEmpty();} 
     public boolean contains(Object o) {return c.contains(o);} 
     public Object[] toArray()   {return c.toArray();} 
     public <T> T[] toArray(T[] a)  {return c.toArray(a);} 
     public String toString()   {return c.toString();} 

     public Iterator<E> iterator() { 
      ... 
     } 

     public boolean add(E e) { 
      throw new UnsupportedOperationException(); 
     } 
     public boolean remove(Object o) { 
      throw new UnsupportedOperationException(); 
     } 

     public boolean containsAll(Collection<?> coll) { 
      return c.containsAll(coll); 
     } 
     public boolean addAll(Collection<? extends E> coll) { 
      throw new UnsupportedOperationException(); 
     } 
     public boolean removeAll(Collection<?> coll) { 
      throw new UnsupportedOperationException(); 
     } 
     public boolean retainAll(Collection<?> coll) { 
      throw new UnsupportedOperationException(); 
     } 
     public void clear() { 
      throw new UnsupportedOperationException(); 
     } 
     @Override 
     public boolean removeIf(Predicate<? super E> filter) { 
      throw new UnsupportedOperationException(); 
     } 
    } 

我想明白了,

1) 如何識別TypeElement,ExecutableElement,VariableElement,AnnotationMirrorjavax.lang.model.element包的作用是否爲上面的代碼?

2) 如何確定DeclaredTypeWildcardTypeExecutableTypejavax.lang.model.type包的MirrorType角色上面的代碼?

3)AnnotationMirror是一個基於鏡像的反射系統,如paper所述?

注:element & type包是元級的設施,這是從傳統的反射系統(Object.getClass()方法或Type.class字面)

+0

這些與'UnmodifiableCollection'有什麼關係?你對這個類有特定的問題,或者你的問題是否適用於任何泛型? – Clashsoft

+0

@Clashsoft我只是以此爲例。我的問題適用於任何泛型類型。我看到你部分回答了 – overexchange

+0

夠公平的,我已經猜到了。 – Clashsoft

回答

0

不同的*TypeAnnotationMirror類是javax.lang.model.element包的所有部分,這是在構建自定義註釋處理器時使用。這個基類是javax.annotation.processing.Processor,這是一個開始尋找幫助的好地方。

實質上,所有這些類型都代表編譯器的抽象語法樹中的節點,它調用您的註釋處理器。它們是隻讀的,這意味着您只能添加自定義錯誤,但不能修改源代碼。

+0

你能回答我的3個問題嗎? – overexchange

+0

我真的不明白你想如何'識別'這些 - 這取決於你如何'走''編譯器傳遞給'process'和'getCompletions'方法中的註釋處理器的抽象語法樹。 'AnnotationMirror'只是表示AST中註釋的不可變視圖。 – Clashsoft

+0

1)'process()'方法的2個參數,即Set <? extends TypeElement> annotations'&'RoundEnvironment roundEnv'表示? ## 2)init()方法的參數,即ProcessingEnvironment processingEnv代表什麼? – overexchange