我有一个很有趣的问题。 我已经定义了注释:
@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);
,它适用于所有计算机。
答案 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!