我是用户定义注释的新手。我正在尝试创建自己的注释,如@NotNull
注释
我想要方法的注释,我希望在满足条件的情况下执行该方法。
这是我的代码:
@Target({ ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PolicyCheck{
String[] policies();
}
我想这样用:
@PolicyCheck(policies = {"P1", "P2"})
public void doSomething(){
}
当我使用提供的策略在方法上调用它时,如果它满足条件,那么只有它必须运行该方法。
如果我对注释的使用有误,请纠正我,请告诉我是否有可能。我也被困在哪里写下它背后的逻辑。
感谢。
答案 0 :(得分:0)
可以在运行时或编译时评估注释,选择哪种方法取决于实际用例。
在运行时使用反射:如评论中所述,您需要一个代理类。您需要拦截对带注释方法的任何调用,检查策略,然后调用实际方法或抛出异常,例如。 Java提供Proxy
类,您可以检查InvocationHandler
内的权限。您可以让用户使用依赖注入或提供处理代理创建的方法
例如,像这样的方法:Foo foo = YourAnnotationLibrary.createProxy(Foo.class);
另一种方法是使用annotation processor,可以在用户编译代码时运行。这对于静态检查很有用,例如确保注释方法上的某些参数类型 - 但是您将无法检查在运行时发生的空参数。您可以生成代理类,但会在运行时强制执行策略。
使用反射可能不那么复杂。如果注释处理适用于您的用例,则对用户来说可能更方便,因为它与现代IDE很好地集成,可以直接在源代码编辑器中显示警告,错误或其他信息,并且可以在应用程序之前防止许多错误。跑。