什么叫注解和注释 注解知多少
什么是注解?用一个词就可以描述注解,那就是元数据,即一种描述数据的数据所以,可以说注解就是源代码的元数据,下面我们就来说一说关于什么叫注解和注释 注解知多少?我们一起去了解并探讨一下这个问题吧!
什么叫注解和注释 注解知多少
什么是注解?
用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。
即使我不使用@Override注解标记代码,程序也能够正常执行。那么,该注解表示什么?这么写有什么好处吗?事实上,@Override告诉编译器这个方法是一个重写方法(描述方法的元数据),如果父类中不存在该方法,编译器便会报错,提示该方法没有重写父类中的方法。
Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具。
无论是xml 还是注解,都被称为元数据,所谓元数据即描述数据的数据。元数据本身不具备任何可执行的能力,只能通过外界代码来对这些元数据进行解析后进行一些操作。
Annotations仅仅是元数据,和业务逻辑无关。理解起来有点困难,但就是这样。如果Annotations不包含业务逻辑,那么必须有人来实现这些逻辑。元数据的用户来做这个事情。Annotations仅仅提供它定义的属性(类/方法/包/域)的信息。Annotations的用户(同样是一些代码)来读取这些信息并实现必要的逻辑。
当我们使用java的标注Annotations(例如@Override)时,JVM就是一个用户,它在字节码层面工作。到这里,应用开发人员还不能控制也不能使用自定义的注解。因此,我们讲解一下如何编写自定义的Annotations。
J2SE5.0版本在 java.lang.annotation提供了四种元注解,专门注解其他的注解:
@Documented –注解是否将包含在JavaDoc中
@Retention –什么时候使用该注解
@Target –注解用于什么地方
@Inherited – 是否允许子类继承该注解
我们定义了自己的注解并将其应用在业务逻辑的方法上。现在我们需要写一个用户程序调用我们的注解。这里我们需要使用反射机制。如果你熟悉反射代码,就会知道反射可以提供类名、方法和实例变量对象。所有这些对象都有getAnnotation()这个方法用来返回注解信息。我们需要把这个对象转换为我们自定义的注释(使用 instanceOf()检查之后),同时也可以调用自定义注释里面的方法。
常见的注解示例:基于注解的权限控制
1. 自定义一个注解 value值表示需要有的权限
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SysRequiredPermission {
String value();
}
2. 拦截器,获取用户权限,判断是否有访问权限
public class AuthInterceptor implements HandlerInterceptor {
@Override
public Boolean preHandle(HttpServletrequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
// 获取token,判断token是否有效
// 根据token获取用户信息,状态是否可用
// 判断用户权限
return Boolean.TRUE;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// clear context
}
/**
* 判断是否有权限
* @param handler
* @return
*/
private boolean hasPermission(Object handler, UserEntity userEntity) {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 获取方法上的注解
SysRequiredPermission requiredPermission = handlerMethod.getMethod().getAnnotation(SysRequiredPermission.class);
// 如果方法上的注解为空 则获取类的注解
if (requiredPermission == null) {
requiredPermission = handlerMethod.getMethod().getDeclaringClass().getAnnotation(SysRequiredPermission.class);
}
// 如果标记了注解,则判断权限
if (requiredPermission != null && StringUtils.isNotBlank(requiredPermission.value())) {
// code here
return permissionFlag;
}
}
return Boolean.TRUE;
}
}
3. 示例
@RestController
@RequestMapping(path = "/xxxxx")
@SysRequiredPermission(value = BizConstants.SomeRoleName)
public class XxxxxController extends BaseRestController {
}
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com