Android创建自定义注释

时间:2016-04-28 08:54:17

标签: java android reflection annotations

我正在学习如何创建自己的注释。我读过这个:http://www.mkyong.com/java/java-custom-annotations-example/ 但是我必须用我的注释传递所有类 - 这很糟糕。所以我读过这个:https://stackoverflow.com/a/7665191/3279023 不幸的是它引发了一个例外:

java.lang.NoSuchFieldException: No field mDexs in class Ldalvik/system/PathClassLoader; (declaration of 'dalvik.system.PathClassLoader' appears in /system/framework/core-libart.jar)

basicly:

Failed to get mDexs field

我的目标:

我想创建自定义注释权限 - 我做了:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Permission {
    String value() default "none";
}

现在,每次运行带有此批注的方法时,我想检查一些条件条件并确定方法是否应该运行...如:

@Permission(value = "testValue")
private void foo() {
    // do stuff if permission allows
}

为什么我想这样做?我认为这将是if语句的良好替代品:

private void foo() {
    if(MyFooClass.STATIC_BOOLEAN_FIELD)
       // do stuff
}

我的项目中有很多if语句,我想以某种方式摆脱它

这甚至可能吗?安全吗?好主意?

1 个答案:

答案 0 :(得分:0)

我不确定这是一个好主意,至少在性能方面......但如果你真的想这样做,你只需要反思。

public void foo() {
    Class<?> c = this.getClass(); // get the class object
    Method m = c.getDeclaredMethod("foo"); // get the method
    Permission p = m.getAnnotation(Permission.class); // get annotation
    if (p!=null && p.value().equals("testValue") {
        // do your test
    }
    else {
        // do what you want 
    }
}

如果您需要多次执行此操作,则可以使用静态方法boolean isAnnotated(String methodName)。因此,您只需在每个相关方法中编写序言:if (isAnnotated("foo")) {} else {}