2016-07-18 9 views
1

メソッドからアノテーション(カスタム記述されたもの)を取得したい。通常、このクラスは、実行時に強化されて、私は CDIマネージドBeanのメソッドに関するアノテーションを取得する

class.getMethod("methodName").getAnnotation("annotationName") 

にアクセスすることにより、クラスローダを依頼することができます。しかし、BeanがCDIコンテナによって管理されている場合(私はOpenWebBeansを使用しています)。次に、アノテーションを要求するためにスーパークラスを使用する必要があります。現在、クラス名で "$$"を検索してクラスが管理されているかどうかを検出しようとしています。しかし、それは私にとって非常に汚い解決策であるようです。

CDIマネージドBeanからアノテーションを取得する良い方法はありますか?

は、具体的には私のコードは、そのようなものです: 私はどのようにクール指定する列挙CoolnessValue経由で非常にクール:-)

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Coolnessfactor { 
    CoolnessValue value(); 
} 

する方法をマークする注釈「Coolnessfactor」を作成しましたメソッドの実装は。

public enum CoolnessValue { 
    POOR, VERY_COOL, UNBELIEVABLE; 
} 

は、その後、私はこの注釈と私のビジネスクラッセで異なる方法をマークし、FE:

@Override 
@Coolnessfactor(CoolnessValue.POOR) 
public void getSingleObjectWithDetails(final Integer techId) { 
    return this.dao.findCompleteDataByPrimaryKey(techId); 
} 

今、私は別のメソッドをマークし、アノテーションの値を分析します。私はCDI-Decoratorでそれを行う必要があります。したがって、私は傍受者バインディングではできません。

現時点では私のアプローチは、注釈値取得するためにリフレクションAPIを使用することです:

public static <A extends Annotation> Map<String, A> getAnnotatedMethodsOfClass(final Class<?> clazz, 
     final Class<A> annotationClazz) { 
    final Map<String, A> annotationMap = new HashMap<String, A>(); 
    Method[] declaredMethods; 
    if (clazz.getName().contains("$$")) { 
     declaredMethods = clazz.getSuperclass().getDeclaredMethods(); 
    } else { 
     declaredMethods = clazz.getDeclaredMethods(); 
    } 
    for (final Method m : declaredMethods) { 
     if (m.isAnnotationPresent(annotationClazz)) { 
      annotationMap.put(m.getName(), m.getAnnotation(annotationClazz)); 
     } 
    } 
    return annotationMap; 
} 

をしかし、これは私にとって非常に恐ろしい見えます。特に、CDIの実装によって強化されたクラスの検出は非常に悪いです。

+1

達成しようとしていることの詳細を教えてください。 –

+0

['BeanManager'](http://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/BeanManager.html)が役立つでしょうか? –

+0

CDI Beanのアノテーションで何を達成しようとしていますか?おそらく(野生の推測)CDIインターセプタがより適しているでしょうか? –

答えて

0

BeanManagerで試してみることもできます。あなたのbeanのBean<?>インスタンスを保持するために使いたいと思うかもしれません。ここでは、どのような種類のBeanに基づいてアプローチが異なります。 APIをシャッフルし、あなたの方法を見つけてください。

Bean<?>を取得すると、getBeanClass()を使用できるようになり、メソッドとその注釈にアクセスできるようになります。

関連する問題