我想在java中创建一个注释,以防止在方法中插入一些值?例如:
public void getInfo(@AnnotationName int position){
}
所以,最后,"位置"将得到e.x 40 - 50之间的值。
答案 0 :(得分:1)
有两种通用方法可以防止方法使用某些形式参数值执行。
进行运行时检查。在运行时,当调用该方法时,如果参数值是非法的,则某些代码会运行并抛出异常。这不会阻止非法调用,并且您的代码将在运行时崩溃,但它确实阻止了在使用非法参数调用时执行该方法。您可以使用断言,通过bean validation等明确地抛出异常来实现此目的。
进行编译时检查。在编译时,如果使用可能非法的值调用方法,编译器将发出警告。这确实可以防止非法调用,也不需要运行时检查,也不需要运行时崩溃。要实现这一点,您需要创建一个作为javac插件运行的annotation processor。 存在框架以便于创建编译时注释处理器,以确保合法地调用方法。一个例子是Checker Framework。
答案 1 :(得分:0)
注释只是一个声明。使用关键字@interface
声明注释并不是一种可能性。
您可以使用注释定义规则。但是有人必须实现代码并且必须执行此代码。
所以,你有几个解决方案。
(1)你可以自己实现所有这些而不需要注释:
public void getInfo(int position){
if(postion < 40 || position > 50) {
throw new IllegalArgumentException("Wrong position")l
}
}
丑陋,但有效。
(2)例如,如果您有接口及其多个实现,则可以使用Wrapper(或Decorator)模式并实现自己的包装器,仅执行验证:
public interface InformationProvider {
public void getInfo(int position);
}
public class InformationProviderImpl implements InformationProvider {
public void getInfo(int position) {
// your implementation
}
}
public class InformationProviderValidator implements InformationProvider {
private final InformationProvider provider;
private final int min;
private final int max;
public InformationProviderValidator(InformationProvider provider, int min, int max) {
this.provider = provider;
this.min = min;
this.max = max;
}
public void getInfo(int position) {
if(postion < min || position > max) {
throw new IllegalArgumentException("Wrong position")l
}
return provider.getInfo(position);
}
}
(3)方法#2可以改进。你确实可以定义注释,例如
public @interface Min {
int value();
}
public @interface Max {
int value();
}
现在InformationProviderValidator
可以发现提供者provider
的类,并从注释中提取最小值和最大值。
(4)从这个解决方案到面向方面的编程只是一步。例如,您可以使用AspectJ。
(5)类似的解决方案是使用验证框架。 Java定义了标准注释(参见http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html)。 (JSR 303)。据我所知,这个标准有2个实现: - http://bval.apache.org/ - http://hibernate.org/validator/
答案 2 :(得分:-1)
尝试bean验证:http://beanvalidation.org/ 有许多注释有助于验证bean的输入