在某些编译器上看不到注释

时间:2014-08-10 16:17:21

标签: java android annotations

我有一个很有趣的问题。 我已经定义了注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnot {

}

我有:

public interface F<T>{
  public void onFinish(T param);
}

public abstract class Foo<T> implements F<T>{
}

此外:

public class Bar extends Foo<Drawable>{
  @Override
  @MyAnnot  
  public void onFinish(Drawable d){
    // ...
  }
}

public class FooBar extends Bar{

  @Override
  @MyAnnot  
  public void onFinish(Drawable d){
    // ...
  }
}

在Foo的一个方法中我添加了:

Method method = this.getClass().getMethod("onFinish", Object.class);
if (method.isAnnotationPresent( MyAnnot.class )){
  //Do sth
}

我在android项目中使用它,在我的一台计算机上工作正常,但第二种isAnnotationPresent总是返回false。两个案例都由IntelliJ Idea在同一部手机上运行。

此外,如果我使用this.getClass().getMethod("onFinish", Drawable.class);,它适用于所有计算机。

1 个答案:

答案 0 :(得分:0)

这是一种使用反射找到正确的参数给getMethod( name, type )的方法。

代码:

package so;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public abstract class Foo<T> implements F<T> {

   public static Class<?> getParameterizedType( Class<?> clazz ) {
      Type t = clazz.getGenericSuperclass();
      while( t != Object.class ) {
         if( t instanceof ParameterizedType ) {
            final Type[] actualTypeArguments =
               ((ParameterizedType)t).getActualTypeArguments();
            for( final Type arg : actualTypeArguments ) {
               return (Class<?>)arg;
            }
         }
         t = ((Class<?>)t).getGenericSuperclass();
      }
      throw new IllegalStateException();
   }

   public static void main( String args[] ) throws Exception {
      final Object fooBar = new FooBar();
      final Class<?> clazz = fooBar.getClass();
      final Class<?> finishArgType = getParameterizedType( clazz );
      System.err.println( "finishArgType = " + finishArgType );
      final Method mth = clazz.getMethod( "onFinish", finishArgType );
      if( mth.isAnnotationPresent( MyAnnot.class )) {
         System.err.println( "Yessssssss!" );
      }
   }
}

输出:

finishArgType = class so.Drawable
Yessssssss!