Java注解知识

Java注解(Annotation)是Java编程语言中的一种特殊形式的元数据,可以用于为程序的各个元素(例如类、方法、字段等)添加额外的信息和属性。

注解的使用

1.注解的写法

@XXX [(一些信息)]

2.注解放置在哪里

类的上面 属性上面 方法上面 构造方法上面 参数前面

3.注解的作用

1.用来充当注释的作用(仅仅是一个文字的说明) @Deprecated (过时/弃用)

2.用来做代码的检测(验证) @Override

3.可以携带一些信息(内容) 文件 (.properties .xml) 注解

4.Java中有一些人家写好的注解供我们使用

@Deprecated 用来说明方法是废弃的

@Override 用来做代码检测 检测此方法是否是一个重写

@SuppressWarnings(信息) String[] {""} 如果数组内的元素只有一个长度 可以省略{}

unused 变量定义后未被使用

serial 类实现了序列化接口 不添加序列化ID号

rawtypes 集合没有定义泛型

deprecation 方法以废弃

unchecked 出现了泛型的问题 可以不检测

all 包含了以上所有(不推荐)

5.注解中可以携带信息 可以不携带

注解数据类型

信息不能随意写 信息的类型只能是如下的类型

1.基本数据类型

2.String类型

3.枚举类型enum

4.注解类型@

5.数组类型[] 数组的内部需要是如上的四种类型

自定义注解

如何自己描述一个注解类型

1.通过@interface 定义一个新的注解类型

2.发现写法与接口非常相似(可以利用接口的特点来记忆注解)

可以描述public static final的属性 比较少见

可以描述public abstract的方法//通常不写 方法要求返回值必须有 返回值类型是如上那些

3.我们自己定义的注解如果想要拿来使用

光定义还不够 还需要做很多细致的说明(需要利用Java提供好的注解来说明)

元注解(也是注解 不是拿来使用的 是用来说明注解)

@Target 描述当前的这个注解可以放置在哪里写的 //是一个数组类型

@Target({TYPE(放在类上写), FIELD(放在属性上写), METHOD(放在方法上写), PARAMETER(参数), CONSTRUCTOR(构造方法), LOCAL_VARIABLE})

正常情况下里面的应该是ElementType.FIELD/ElementType.METHOD

如果不写前面的ElementType就需要静态导入包

import static java.lang.annotation.ElementType.*;

@Retention 描述当前的这个注解存在什么作用域中的(通常放在RUNTIME)

@Retention(RetentionPolicy.SOURCE)//里面只可以写一个类型

源代码文件--->编译--->字节码文件--->加载--->内存执行

SOURCE CLASS RUNTIME

@Inherited 描述当前这个注解是否能被子类对象继承

@Document 描述这个注解是否能被文档所记录

4.自己使用自己描述的注解

问题1. 在注解里面描述了一个方法 方法没有参数 方法是有返回值String[]

使用注解的时候 让我们传递参数

理解为 注解的方法做事 将我们传递给他的参数 搬运走了 给了别人

问题2. 使用别人写好的注解不用写方法名 我们自己定义的方法必须写名字

如果我们自己定义的注解 只有一个方法 方法名字叫value

在使用的时候就可以省略方法名

如果传递的信息是一个数组 数组内只有一个元素 可以省略{}

如果方法是两个以上 每一个方法必须写名字 ()

   String value() default  "aa";  //表示如果没有写value就是默认值"aa"

解析注解

如何解析注解内携带的信息(反射机制)

1.获取类Class

2.获取类中的成员 类 属性 方法 构造方法

3.Annotation a = 成员.getAnnotation(注解类型.class); 注解类型:定义写注解的名字

4.注解对象 执行方法获取返回结果

Class clazz=Person.class;

Method con= clazz.getMethod("eat"); //注解在Person类的eat方法上

MyAnnotation an= con.getAnnotation(MyAnnotation.class);//获取注解 MyAnnotation自己写的注解类

an.value();//得到写在注解类中方法名叫value的值

an.resultType();//得到写在注解类中方法名叫resultType的值

Class anClass= an.getClass();//得到注解类

Method me=anClass.getMethod("value");

String[] str= (String[])me.invoke(an);//执行注解中的方法

如果在定义注解的时候@Retention()没有把作用域写成RUNTIME解析注解时会出现空指针异常

注解应用场景

  1. 代码配置:注解可以用于配置代码,通过在注解中指定参数来控制代码的行为。例如,Spring框架中的@Configuration注解可以用于配置类,告诉Spring框架该类是一个配置类,并且可以通过在注解中指定参数配置一些行为。
  2. 编译时处理:注解可以在编译时对代码进行一些处理,例如使用注解生成代码。例如,JPA规范中的@Entity注解可以用于标识一个类是一个实体类,编译器可以根据这个注解生成相应的数据库表结构。
  3. 拦截器或AOP:Java自定义注解一般使用场景为自定义注解+拦截器或者AOP,使用自定义注解来自己设计框架,使得代码看起来非常优雅。

扩展Properties类的使用

java.util

继承HashTable(是HashMap的早期版本 线程安全)

使用方式像是map集合 value = getProperty(key)方法

读取的信息是文件 -->高级流

读取文件的后缀名.properties

文件里面的内容以key=value存在 中间=可以写成:或空格(不推荐使用,最好使用=)

Properties pro=new Properties();

pro.load(new FileReader("src//test.properties")); //文件要求是纯文本形式 文件后缀是.properties

文件数据是以行为单位 每行中的信息是key-value形式

读取到后就说明找到了文件

load(InputStream) load(Reader)

String value= pro.getProperty("key1");//获取key1对应的value值

Object value=pro.get("key1");//返回值是Object类型的

Enumeration en=pro.propertyNames();//返回所有的key

遍历Properties的值 跟map遍历差不多

为了和map区分properties遍历写成如下

Enumeration en=pro.propertyNames();//跟hashmap.keySet()作用相同获取properties文件的全部key
while(en.hasMoreElements()){   
  String key=(String)en.nextElement();
    String value=pro.getProperty(key);
    System.out.println(key+"="+value);
}	

读取properties配置文件 快速找到properties文件 默认是找src目录下

所以一般把这个文件存在src目录下

InputStream is = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("mapping.properties");  //返回是一个字节流 读取中文会出现乱码 需要转为字符流
InputStreamReader reader=new InputStreamReader(is);
Thread.currentThread().getContextClassLoader().getResource(newPack).getPath();//获取类名	
//E:/java/IdeaProjects/mcv14/out/artifacts/Test_web_war_exploded/WEB-INF/classes/controller/
//如果路径不存在会报错

总结

1.注解写法

@XXXX (信息)

2.注解放置在哪里写a

类 方法 属性 构造 变量 参数(放在参数的前面)

3.Java中定义好的注解

@Deprecated 废弃的

@Override 检测方法是否是重写

@SuppressWarnings 去掉程序中的警告(尽量不要用 尽量通过编写代码去掉警告)

unused serial rawtypes deprecation unchecked all

4.如何自己定义注解

描述一个自己的类 @interface

类的上面通过元注解来描述

@Target

@Retention

@Inherited

想要携带一些信息 自定义注解类型 添加方法

方法要求必须有返回值 返回值类型 基本 String 枚举 注解 数组

方法的作用将我们传递的信息 搬走了 交给别人

5.注解的作用

充当注释 仅仅是一个文字说明

代码检测 @Override

携带信息

6.如何访问到注解对象

如何获取里面的信息(需要反射机制)

7.注解在开发中应用的场景


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值