注释如何在运行时检查验证
How annotation check validation at runtime
我正在使用自定义注释构建,我正在创建一些自定义注释来验证一些 data.I 我无法为该注释编写注释处理器。
即我创建了一个自定义注释 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.find(id, class); 时,实体管理器会检查 class 元数据,例如(主键和 tablename...等)在..之前解析(正如我在 classInfo 示例中试图告诉你的那样)并将其添加到 entitymanager has map field
Map<Class,EntityInfo>
命名为实体(对于我的示例,它必须是 map 必须像那个 Map )当你 运行 dao.find(id,User.class) .. 它会检查那个地图。从那里获取 id 字段和 table 信息和解析器(解析 sql 类似 "select * from" + entity.getTableName() +" where "+ entity.getIdField() .getName() +" = "+ id ) 和 运行s 查询和 returns 结果...我希望现在您可以理解我想告诉您的内容..
How and where are Annotations used in Java? ...好答案首先阅读什么是注释..
注释描述了方法、字段或 class 将执行的操作。所以它不是传递参数,而是定义规则……对于您的示例,如果有 3 种类型的用户。 Admin Normal Guest 和你有一个只能由 Admin 类型的用户调用的方法,比如 deleteProduct ..
你必须使用:
@UserRoles([Admin])
public void deleteProduct(){
///......
}
@UserRoles([Admin,Normal])
public void commentProduct() {}
例如你有一个 url 和
www.site.com/comments/15/likes?offset=15
你正在编写一个 webroute 处理程序..它有注释 @WebMethod (Post , Get , Put, Delete etc) , @ WebParameter (POST and GET PARAMETER , @URLParam( URL PARAM handler) ;
评论/:id/likes/
你必须那样做..
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
}
}
注解的逻辑是这样的..
这是另一个例子..
首先你必须创建一个持有者对象(它持有反射读取的所有信息)这样你就可以用对象的代理来改变它..
例如,如果您对字段使用 @Id 和 @ColumnName 注释,对方法使用 @Async 注释...
您必须写入 Class 对象 FieldInfo,其中包含字段 ID,名称
为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());
}
}
和方法,你解析的方法参数你必须用它做什么..
希望这些信息对您有所帮助...
如果您还有其他问题,请随时提问
我正在使用自定义注释构建,我正在创建一些自定义注释来验证一些 data.I 我无法为该注释编写注释处理器。
即我创建了一个自定义注释 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.find(id, class); 时,实体管理器会检查 class 元数据,例如(主键和 tablename...等)在..之前解析(正如我在 classInfo 示例中试图告诉你的那样)并将其添加到 entitymanager has map field
Map<Class,EntityInfo>
命名为实体(对于我的示例,它必须是 map 必须像那个 Map )当你 运行 dao.find(id,User.class) .. 它会检查那个地图。从那里获取 id 字段和 table 信息和解析器(解析 sql 类似 "select * from" + entity.getTableName() +" where "+ entity.getIdField() .getName() +" = "+ id ) 和 运行s 查询和 returns 结果...我希望现在您可以理解我想告诉您的内容..
How and where are Annotations used in Java? ...好答案首先阅读什么是注释..
注释描述了方法、字段或 class 将执行的操作。所以它不是传递参数,而是定义规则……对于您的示例,如果有 3 种类型的用户。 Admin Normal Guest 和你有一个只能由 Admin 类型的用户调用的方法,比如 deleteProduct ..
你必须使用:
@UserRoles([Admin])
public void deleteProduct(){
///......
}
@UserRoles([Admin,Normal])
public void commentProduct() {}
例如你有一个 url 和
www.site.com/comments/15/likes?offset=15
你正在编写一个 webroute 处理程序..它有注释 @WebMethod (Post , Get , Put, Delete etc) , @ WebParameter (POST and GET PARAMETER , @URLParam( URL PARAM handler) ;
评论/:id/likes/
你必须那样做..
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
}
}
注解的逻辑是这样的.. 这是另一个例子..
首先你必须创建一个持有者对象(它持有反射读取的所有信息)这样你就可以用对象的代理来改变它..
例如,如果您对字段使用 @Id 和 @ColumnName 注释,对方法使用 @Async 注释...
您必须写入 Class 对象 FieldInfo,其中包含字段 ID,名称
为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());
}
}
和方法,你解析的方法参数你必须用它做什么..
希望这些信息对您有所帮助... 如果您还有其他问题,请随时提问