Java注解(Annotation):请不要小看我!(1)

简介: Java注解(Annotation):请不要小看我!

在 Java 中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为 RTTI,英文全称为 Run-Time Type Identification,即运行时类型识别,有没有一点“知行合一”的味道?运行时类型识别主要由Class类实现。


Java注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。


网络上对注解的解释过于严肃、刻板,这并不是我喜欢的风格。尽管这样的解释听起来非常的专业。


为了缓解大家对“注解”的陌生感,我来说点有意思的。其实我对“注解”这个词的第一印象并不是Java的注解,而是朱熹的名作《四书章句集注》。为什么我会有这么大的脑洞呢?因为当我试着去翻译Annotation这个单词的时候,得到的结果是“注释”而不是“注解”。《四书章句集注》正是朱熹对《大学》、《中庸》、《论语》、《孟子》四书做出的重要的注释。要知道,该书可是明清以后科举考试的题库和标准答案!


注解(Annotation)是在 Java SE 5.0 版本中开始引入的概念,同class和interface一样,也属于一种类型。很多开发人员认为注解的地位不高,但其实不是这样的。像@Transactional、@Service、@RestController、@RequestMapping、@CrossOrigin等等这些注解的使用频率越来越高。


01、为什么要使用注解呢?


为什么要使用注解呢?让我们从另外一个问题说起。


“跨域”这两个字就像一块狗皮膏药黏在每一个前端开发者的身上;我也不例外,虽然我并不是一个纯粹的前端开发者。


跨域问题的出现,源于浏览器的同源策略——限制一个源加载的脚本去访问另外一个源的资源,可有效地隔离潜在的恶意文件,是一种重要的安全机制。

image.png



跨域问题的解决方案也有很多,比如说:


1)JSONP


2)Nginx代理


3)"跨域资源共享"(Cross-origin resource sharing),简称CORS,可以说是处理跨域问题的标准做法。


记得第一次遇到跨域问题的时候,我特意向一个同学请教了解决方案,他告诉我的答案如下。


第一步,在web.xml添加filter。


<filter>
  <filter-name>contextfilter</filter-name>
  <filter-class>com.cmower.filter.WebContextFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>contextfilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>


第二步,实现WebContextFilter类。


public class WebContextFilter implements Filter {
    @Override
    public void destroy() {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse  httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpServletResponse.setHeader("Access-Control-Allow-Headers", "accept,content-type"); 
        httpServletResponse.setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST,DELETE,PUT"); 
        chain.doFilter(request, httpServletResponse);
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

看到这样的解决方案,我真的是蛮崩溃的。不就一个跨域问题嘛,用得着这么多代码吗?


我对这样的解决方案非常的不满意。于是下定决心要好好的研究一番,大概花了半天的时间吧,我终于搞清楚了“跨域”问题,以及它的标准解决方案CORS。并且找到了一个极为简洁的解决方案——@CrossOrigin,只要在Controller类上加上这个注解,就可以轻松地解决跨域问题。


代码如下。


@RestController
@RequestMapping("course")
@CrossOrigin
public class CourseController {
}


如果没有找到@CrossOrigin这个注解,我真的就要按照同学提供的方案去解决跨域的问题了。但那样做就好像,我们卖掉家里的小汽车,然后出行的时候驾一辆马车一样。


这也正是我想告诉你的,为什么要使用注解的原因:它让我们的代码看起来更简洁,更有时代的进步感。


02、该如何定义注解呢?


注解需要通过@interface关键字(形式和接口非常的相似,只是前面多了一个@)进行定义。我们可以打开@CrossOrigin的源码来看一下。

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
    /**
     * List of allowed origins, e.g. {@code "http://domain1.com"}.
     * <p>These values are placed in the {@code Access-Control-Allow-Origin}
     * header of both the pre-flight response and the actual response.
     * {@code "*"} means that all origins are allowed.
     * <p>If undefined, all origins are allowed.
     * @see #value
     */
    @AliasFor("value")
    String[] origins() default {};
    /**
     * List of request headers that can be used during the actual request.
     * <p>This property controls the value of the pre-flight response's
     * {@code Access-Control-Allow-Headers} header.
     * {@code "*"}  means that all headers requested by the client are allowed.
     * <p>If undefined, all requested headers are allowed.
     */
    String[] allowedHeaders() default {};
    /**
     * List of supported HTTP request methods, e.g.
     * {@code "{RequestMethod.GET, RequestMethod.POST}"}.
     * <p>Methods specified here override those specified via {@code RequestMapping}.
     * <p>If undefined, methods defined by {@link RequestMapping} annotation
     * are used.
     */
    RequestMethod[] methods() default {};
}


从上面的代码可以看得出来,“注解”真的很“注解”,除了注释多和“元注解”多之外,真没有别的了。


“元注解”?什么是“元注解”呢?


“元注解”是用来注解(动词)注解(名词)的注解(名词)。请感受汉语的博大精深。@Target、@Retention和@Documented就是所谓的元注解。

相关文章
|
1月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
65 7
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
109 43
Java学习十六—掌握注解:让编程更简单
|
1月前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
83 5
|
2月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
74 14
|
2月前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
44 0
|
3月前
|
JSON Java 数据库
java 常用注解大全、注解笔记
关于Java常用注解的大全和笔记,涵盖了实体类、JSON处理、HTTP请求映射等多个方面的注解使用。
57 0
java 常用注解大全、注解笔记
|
4月前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
4月前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
3月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
29 0
|
3月前
|
XML Java 数据格式
Java-spring注解的作用
Java-spring注解的作用
34 0
下一篇
开通oss服务