什么叫注解和注释 注解知多少

什么是注解?用一个词就可以描述注解,那就是元数据,即一种描述数据的数据所以,可以说注解就是源代码的元数据,下面我们就来说一说关于什么叫注解和注释 注解知多少?我们一起去了解并探讨一下这个问题吧!

什么叫注解和注释 注解知多少

什么叫注解和注释 注解知多少

什么是注解?

用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。

即使我不使用@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

    分享
    投诉
    首页