如何在Android中检查运行时的方法注释?

时间:2014-01-07 22:34:04

标签: java android annotations

我目前正在为Android开发一个库,我想确保某些方法使用我的自定义注释进行注释。具体地,

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

}


public class Hello {

    @MustBeAnnotated
    public void doOne() {
        System.out.println("doOne()");
    }

    @MustBeAnnotated
    public int doTwo() {
        System.out.println("doTwo()");
        return 0;
    }
}

在纯Java环境中,我能够通过main()方法验证这些方法,并且我正在使用Google Reflection library

import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;

import java.lang.reflect.Method;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        ConfigurationBuilder bd = new ConfigurationBuilder();
        bd.setUrls(ClasspathHelper.forPackage("com.greystripe.sdk"));
        bd.setScanners(new MethodAnnotationsScanner());
        Reflections reflections = new Reflections(bd);
        Set<Method> methods = reflections.getMethodsAnnotatedWith(MustBeAnnotated.class);
        for (Method m : methods) {
            System.out.println(m.getName());
        }
    }
}

但我不确定如何在Android环境中实现相同的功能,因为没有公开提供此类main()方法。我唯一能想到的课程是Application,但作为一个图书馆提供者,我似乎无法触及这门课程。基本上,我只想调用带注释的方法。因此,如果任何开发人员声明没有注释的新方法并调用它(hello.doThree()),他们将收到运行时异常。

public class Hello {

    @MustBeAnnotated
    public void doOne() {
        System.out.println("doOne()");
    }

    @MustBeAnnotated
    public int doTwo() {
        System.out.println("doTwo()");
        return 0;
    }


    /**
     * Without annotation, a RuntimeException should be thrown!
     */
    public void doThree() {
        // ...
    }
}



    // ....
    // ...
    Hello hello = new Hello();
    // throw Runtime exception because doThree() has no annotation
    hello.doThree();

非常感谢任何帮助或建议。

0 个答案:

没有答案