java入门篇10 --- 注解

从JVM的角度看,注解本身对代码逻辑没有任何影响,如何使用注解完全由工具决定。

Java的注解可以分为三类:

第一类是由编译器使用的注解,例如:

  • @Override:让编译器检查该方法是否正确地实现了覆写;
  • @SuppressWarnings:告诉编译器忽略此处代码产生的警告。

这类注解不会被编译进入.class文件,它们在编译后就被编译器扔掉了。

第二类是由工具处理.class文件使用的注解,比如有些工具会在加载class的时候,对class做动态修改,实现一些特殊的功能。这类注解会被编译进入.class文件,但加载结束后并不会存在于内存中。这类注解只被一些底层库使用,一般我们不必自己处理。

第三类是在程序运行期能够读取的注解,它们在加载后一直存在于JVM中,这也是最常用的注解。例如,一个配置了@PostConstruct的方法会在调用构造方法后自动被调用(这是Java代码读取该注解实现的功能,JVM并不会识别该注解)。

java语言中使用@interface来定义注解,我们自定义注解的时候,一定要记得加上@Target,里面的参数根据情况添加,ElementType.METHOD, ElementType.FIELD ...

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}
@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Retention {    /**     * Returns the retention policy.     * @return the retention policy     */    RetentionPolicy value();}
 

@Retention这个愿注解可以定义注解的生命周期, 默认情况为仅class文件

  • 仅编译期:RetentionPolicy.SOURCE
  • 仅class文件:RetentionPolicy.CLASS
  • 运行期:RetentionPolicy.RUNTIME

接下来看一下自定义的注解如何使用,这个可以在我们做单元测试时使用

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;

// 把最常用的参数定义为value(),推荐所有参数都尽量设置默认值。
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
    int min() default 0;

    int max() default 20;
}

class Person {
    @MyAnno(min = 10, max = 80)
    public int age;
}

public class HelloWorld {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        Person p1 = new Person();
        p.age = 100;
        p1.age = 15;
        Field f = Person.class.getField("age");
        int s = (Integer) f.get(p);
        int s1 = (Integer) f.get(p1);
        MyAnno anno = f.getAnnotation(MyAnno.class);
        System.out.println(s < anno.max() && s > anno.min());  // false
        System.out.println(s1 < anno.max() && s1 > anno.min());  // true
    }
}

原文地址:https://www.cnblogs.com/yangshixiong/p/12168933.html

时间: 2024-11-09 04:47:21

java入门篇10 --- 注解的相关文章

java入门篇3 --- 基本数据类型的运算

一.整数 1.运算 java的整数运算遵从基本的四则运算,不再赘述 下面说一下整数的除法得到的结果永远是精确的,也就是除不尽就给你取整,我记得python2的int类型会保留小数,python3之后也只保留整数 另外取余也是使用%,除法如果除数是0,运行时会报错. 注意,整数有范围,如果超出最大的会溢出,感觉像是又重新走了一个循环.请根据需要使用整型的类型,如果数值大于int范围,可以使用long 另外java也支持n++, n+=1语法糖 public class HelloWorld { p

spring入门篇10 --- springMVC入门小程序

继续昨晚没有完成的这个小demo,完成这个,我们基本上算入门 首先,这个demo继续使用注解方式,源码地址github 首先看一下这个,这个就是maven起的项目结构,使用SpringMVC起项目,webapp就会与src同级,但是我们一般把src当作源码目录,所以做好可以做到同级,但这个就是为了练习. 首先明确一下,DispatcherServlet是实现servlet接口,Dispatcher使用Spring配置文件告知spring他需要请求反射,视图解析,异常处理等,而我们项目一般是跑在t

java入门篇12 --- IO操作

在jiava中InputStream跟OutputStream分别代表输入流跟输出流,接下来来看一下IO的相关操作 首先来看一下如何操作文件 import java.io.File; import java.io.FilenameFilter; import java.nio.file.Path; import java.nio.file.Paths; public class HelloWorld { public static void main(String[] args) throws

java入门篇4 --- 引用类型

1.String字符串 我们常用的字符串属于引用类型,它可以包含0至n个字符,String使用双引号,字符串的拼接也可以使用+ public class HelloWorld { public static void main(String[] args) { String s = "我爱中国"; String s1 = "i " + "love " + "china"; String s2 = null; // String

java入门篇11 --- 集合

无论什么语言,集合应当是我们最常用的一种类型啦,大体上分为有序列表.map.sey.队列 首先先来看一下有序列表, List内部跟数组一样也是按照先后顺序排放的,但对于增删,非常方便,list的实现大多是使用ArrayList实现的,先来看一下List的源码,这里面有一个<E>,这个就是泛型,java是面向对象语言,他在运行期间,才会将我们的类进行初始化,因此,就利用这一特性,我们输入指定的引用类型,注意必须是引用类型,基本类型不是类,JVM在编译是,会把它当作object,然后再运行期间就会

mybatis对java自定义注解的使用——入门篇

最近在学习spring和ibatis框架. 以前在天猫实习时做过的一个小项目用到的mybatis,在其使用过程中,不加思索的用了比较原始的一种持久化方式: 在一个包中写一个DAO的接口,在另一个包里面写DAO的实现,使用sqlMapClient来从***-sql.xml中读取相应的sql. public interface IBaseDaoiBatis { Object get(String statementName); } public class BaseDaoiBatis impleme

《Java从入门到放弃》入门篇:springMVC数据校验

昨天我们扯完了数据传递,今天我们来聊聊数据校验的问题.来,跟着我一起读:计一噢叫,一按艳. 在springMVC中校验数据也非常简单,spring3.0拥有自己独立的数据校验框架,同时支持JSR303标准的校验框架. Spring的DataBinder在进行数据绑定时,会同时调用校验框架完成数据校验工作. 具体使用步骤如下: 1)导入数据校验的JAR包 2)在springmvc的配置文件中添加校验Bean 3)修改实体类,在属性上加上校验的注解 4)修改昨天的login4方法,加上校验的相关代码

Java入门到精通——调错篇之Spring2.5利用aspect实现AOP时报错: error at ::0 can&#39;t find referenced pointcut XXX

一.问题描述及原因. 利用Aspect注解实现AOP的时候出现了error at ::0 can't find referenced pointcut XXX.一看我以为注解写错了,结果通过查询相关资料是因为Spring2.5与中的aspectjweaver.jar 和aspectjrt.jar这两个jar包与JDK1.7不匹配. org.springframework.beans.factory.BeanCreationException: Error creating bean with n

热烈庆祝【深入浅出Java虚拟机——入门篇】培训课程在51CTO上线了

我的视频[深入浅出Java虚拟机--入门篇]在51CTO学院上线了. 想了解的可以点击: http://edu.51cto.com/course/course_id-1952.html 课程框架如下: 1.jvm概述 2.java规范和JVM规范简述 3.生活中的数字在计算机中的表示 4.jvm内存划分 5.jvm内存模型 6.jvm调试跟踪参数 7.jvm内存控制上 8.jvm内存控制下 9.jvm中class的装载过程 10.jvm中classloader的设计模式 11.jvm中有关cla