如何在运行时检查验证

时间:2015-07-24 07:34:19

标签: java reflection annotations

我正在使用自定义注释构建,我正在创建一些将验证某些数据的自定义注释。我无法为该注释编写注释处理器。

即。 我创建了一个自定义注释UserRole:

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

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER })
public @interface UserRole
{
    int[] value() default {0};
}

我将使用此注释如下:

import java.util.List;
public class Demo
{
    public void checkValidUser(@UserRole({1,2})List<Integer> roles){
        // some code here
        }
}

我想编写Annotation处理器,以便我可以检查给定列表是否包含在运行时在注释中指定的任何角色,因为我将在运行时提供List。 我需要帮助来编写注释处理器。

先谢谢。

1 个答案:

答案 0 :(得分:2)

在你的最后一次评论之后,让我们试着了解jpa是如何工作的

当你使用 dao.find(id,class); 实体管理器检查之前解析的类元数据(主键和表名等)...(因为我正在尝试告诉你在classInfo例子中)并将它添加到entitymanager有map字段

Map<Class,EntityInfo>
当你运行dao.find(id,User.class)时,

被命名为实体(对于我的例子,它必须是map必须像那个Map)..它检查那个map。从那里获取id字段和表信息和解析器(解析sql类似于这样的&#34; select * from&#34; + entity.getTableName()+&#34;其中&#34; + entity.getIdField()。 getName()+&#34; =&#34; + id)并运行查询并返回结果...我希望你现在能理解我想告诉你的内容..

How and where are Annotations used in Java? ...好的答案首先阅读什么是注释..

注释描述方法,字段或类将执行的方式..因此它不是传递参数,它是定义规则...对于您的示例,如果有3种类型的用户...管理员正常访客和你有一种只能由用户类型Admin调用的方法,如deleteProduct ..

你必须使用:

@UserRoles([Admin])
public void deleteProduct(){
///......
} 

@UserRoles([Admin,Normal])
public void commentProduct() {}

例如,您的网址为 www.site.com/comments/15/likes?offset=15

你正在写一个webroute处理程序..它有注释 @WebMethod (Post,Get,Put,Delete等), @WebParameter (POST和GET PARAMETER, @URLParam (URL PARAM处理程序);

评论/:ID /喜欢/

你必须那样做..

public class Comments {
 // handles url path like  /comments/12/likes?offset=15 
 @WebMethod(MethodType.GET)
  @WebURL("comment/:id/likes/") 
  public void listLikes(@WebParameter(name="offset") int offset, @URLParam("id") long id) {
  //operatio to Do  so here offset will be 15  ,id 12
}
}

注释的逻辑类似于...... 这是另一个例子..

首先你必须创建一个持有者Object(它包含所有反射引导的信息),这样你就可以用对象代理来实现它。

例如,如果你有注释的@Id和@ColumnName,以及方法的@Async ......

你必须写入具有字段ID,名称

的类对象FieldInfo

Class

 class ClassInfo {
   private  final      Set<MethodInfo> methods; 
   private final Set<FieldInfo> fields; 
}

对于字段

 class FieldInfo {
    private   boolean id=false; 
    private Field fieldInfo ; 
    private  String columnName;
    /// More info for fields like field name  
    // constructors 
    //Getters and Setters 
         //methods to use 
} 

方法

 class MethodInfo {
       private Method methodInfo; 
       private  boolean async= false;  
        /// More info for methods  like field name  
            // constructors 
            //Getters and Setters 
         //methods to use 
    }

所以你可以使用反射(我只为Field做你可以按照你想要的方法和方法参数)

  final   ClassInfo classInfo = new ClassInfo(); 
  Field[] fields =   Demo.class.getFields(); 
 for(final field :fields) {
    FieldInfo fieldInfo = new FieldInfo(field);
    if(field.hasAnnotation(Id.class)) {
      fieldInfo.setId(true); 
   } 
    if(field.hasAnnotation(ColumnName.class){
     final ColumnName col = field.getAnnotation(ColumnName.class); 
     fieldInfo.setColumnName(col.value());
    }
 }

和方法,方法参数,你已经解析了它与你有什么关系..

我希望这些信息可以帮助你...... 如果您有任何疑问,请随时提出