我正在使用自定义注释构建,我正在创建一些将验证一些数据的自定义注释。我不能为那个注释编写注释处理器。
。我创建了一个自定义注释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
}
}
我想写一个注释处理器,这样我就可以检查给定的列表是否包含在运行时指定的注释中的任何角色,因为我将在运行时提供列表。我需要帮助来编写注释处理器。
提前感谢。
在你最后的评论之后,让我们试着理解jpa是如何工作的
当你使用dao时。查找(id, class);
实体管理器检查类元数据,如(主键和表名…等),这是解析之前…(因为我试图告诉你在classInfo的例子),并将其添加到entitymanager有地图字段Map<Class,EntityInfo>
命名为实体(对于我的例子,它必须是map必须像那个map),当你运行dao.find(id,User.class) ..它会检查地图。从那里获取id字段和表信息和解析器(解析sql类似于"select * from"+ entity.getTableName() +"where"+ entity.getIdField().getName() +"="+ id)并运行查询并返回结果…我希望现在你能明白我想告诉你的。
在Java中如何以及在哪里使用注释?…好答案,先看看什么是注释…
注释描述方法、字段或类将做什么的方式。所以它不是在传递参数,而是在定义规则…举个例子,如果有3种类型的用户…Admin Normal Guest和u有一个方法,只能由用户类型Admin调用。像deleteProduct . .
你必须使用:
@UserRoles([Admin])
public void deleteProduct(){
///......
}
@UserRoles([Admin,Normal])
public void commentProduct() {}
例如你有一个url
www.site.com/comments/15/likes?offset=15
,你正在写一个网页处理程序。其中有注释@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
}
}
注释的逻辑之类的…这是另一个例子……
首先,你必须创建一个holder Object(它保存反射读取的所有信息),这样你就可以用Object的代理来避免它。
例如,如果你有@Id和@ColumnName的注释字段,@Async的方法…
你必须写类对象FieldInfo它有字段Id,名称
对于类
class ClassInfo {
private final Set<MethodInfo> methods;
private final Set<FieldInfo> fields;
}
For 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
}
For Methods:
class MethodInfo {
private Method methodInfo;
private boolean async= false;
/// More info for methods like field name
// constructors
//Getters and Setters
//methods to use
}
所以你可以使用反射(我只对字段这样做,你可以对方法和方法参数这样做,就像你想要的)
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());
}
}
和方法,你有方法参数解析你要做什么。
我希望这些信息能帮助你……如果还有什么问题,请随时问我