简单谈谈java注解

5 篇文章 0 订阅
1 篇文章 0 订阅

java注解

此注解非彼注解,相对于开发中配置XML文件,注解更加方便简洁,有了注解在很大程度上
可以免去XML一部分任务。

1、什么是注解?

注解:Annotation

简单来说就是代码中的特殊标记,带有@的特殊标记。

这些标记会在代码编译、运行、类加载等的时候被读取到,并执行相对应的处理。

2、为什么要用到注解?

传统方法来讲,我们一般是在配置文件XML中配置我们需要的信息来告诉该去如何实现运行,通俗点儿讲就像是我们平时看书的时候的标签一样,在使用这段代码时我们或者编译器会先去看你的标签上写了什么,说明了什么。

有了注解技术后就可以直接在代码中通过给类、方法上输入信息的方式告诉类如何去实现,在代码阶段就已经告知了一些在配置文件中需要做的事情,这些注解不会直接影响到你的代码执行。

简单说几种相对常见的注解吧

  • @Override
  • @Deprecated
  • @SuppressWarnings
  • @SafeVarargs
  • @Resource
    ①@Override

override是重写父类非私有方法,返回类型和形参都不能改变,不能重写final方法(继承),告诉编译器要检查该方法是实现父类的,可以帮助我们避免一些低级问题

②@Deprecated

Deprecated是过时注解,在开发过程可能会觉得某些方法设计得不够好,为了兼容以前的程序又不能将其删掉,于是就把他设置为过时。而一旦设置成过时得方法后在调用得时候IDE上会显示一条横杠,表明这是过时的。

③@SuppressWarnings

SuppressWarnings是抑制编译器警告注解,该注解不是很常见,它的最大的作用就是写出来让编译器不发出警告(是不发出警告不是不报错!!),我知道有问题但我就是不想让编译器提醒。

④@SafeVarargs

SafeVarargs是堆污染警告,该注解提示开发者不要用参数做一些不安全多余的操作,它的存在会让编译器出现unchecked这样的警告。
还有一些注解因为不常用或者说我还没用到所以就不一一列举,有兴趣的可以自行查看相关资料。

⑤@Resource

Resource是做依赖注入,从容器中自动获取bean。是Spring下的。
在启动容器后会在容器中默认寻找可加载bean中含有@Resource注解的并判断@Resource注解括号中的name属性是否为空,如果为空:看spring容器中的bean的id与@Resource要注解的那个变量属性名是否相同,如相同,匹配成功;如果不相同,看spring容器中bean的id对应的类型是否与@Resource要注解的那个变量属性对应的类型是否相等,若相等,匹配成功,若不相等,匹配失败
如果@Resource注解括号中的name属性不为空,看name的属性值和容器中的bean的id名是否相等,如相等,则匹配成功;如不相等,则匹配失败

3、注解与反射

我们的代码中有了注解之后得用得上啊,怎么知道我们的注解是否有效或者说是否正确?怎么将我们的注解运用到方法上呢?那就得用到一个机制---->反射

什么是反射?

反射指的是我们可以在运行期间加载、探知、使用编译期间完全未知的类。是一个动态的机制,允许我们通过字符串来指挥程序实例化,操作属性、调用方法。
加载完类之后,在堆内存中,就产生了一个 Class 类型的对象,这个对象就包含了完整的类的结构信息。 我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过 这个镜子看到类的结构,所以,我们形象的称之为:反射

*****首先来做一遍自定义注解代码演示:

//自定义一个注解
//跟写接口有点类似但是多了一个@
//该注解没有添加任何成员变量,叫做标记注解
public @interface cheaper{}
//既然是自定义注解,那么也应该可以添加成员变量
public @interface cheaper{
	//定义两个成员变量
	Sting name();
	int age();
	//这里只能是String,数组,class,注解,枚举类
}//注解中的成员变量的作用就像是XML文件中经过嵌套将信息告诉程序怎么运行

再将定义的注解运用到方法中

//因为在上面定义的注解中我们声明了name和age这两个属性,所以在修饰的时候就给出相应的值
@cheaper(name = "zahngsan",age = 99)
//或者在定义注解的之后直接给出值(默认值),这样在修饰的时候不用具体指出值
public void add(String name,int age){}

有一种特殊情况当注解只有一个属性且为value,那么在使用的时候直接赋值就可以了

public @interface cheaper{
	String value();
}
//使用的时候直接赋值
@cheaper("zhangsan")
public void add(String id){}

重点来了,接下来是我们的反射:
利用反射技术将我们的注解上的信息注入到方法上

//反射出该类的方法
Class class = Person.class;
Method method = class.getMethod("add",String.class,int.class);

//通过该方法得到注解上的具体信息
cheaper cheaper1 = method.getAnnotation(cheaper.class);
String name = cheaper1.name();
int age = cheaper1.age();

//将注解上的信息注入到方法上
Object o = aClass.newInstance();
method.invoke(o,username,age);

总结来就是三个步骤:

  • 反射出该类方法
  • 通过方法得到注解上的具体信息
  • 将注解上的信息注入到方法上

4、元注解
注解千千万不是每一个都一定用得上也不是每一个都记得住,有时候可以尝试着自己去定义我们的注解,用自己的注解去注解其他的注解,这里就引出一个"元注解"概念。
在jdk5中定义了四种类型的元注解:
①@Target
@Target是描述注解的适用范围,可以是用在:
packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标,且只有一个成员变量value.

②@Retention
@Retention这个注解其实在上面的代码演示最后运用到方法中还应该最后再加一个@Retention的不然代码会报错。
@Retention只能用来修饰其他的Annotation,用于指定被修饰的Annotation被保留的时长。不同于@Target只有一个成员变量,它有三个分别是:
RetentionPolicy_SOURCE
RetentionPolicy_CLASS
RetentionPolicy_RUNTIME
分别对应三个时期:编译、class、运行。一般@Retention默认class

③Documented
@Documented用于指定被该Annotation修饰的Annotation类将被javadoc工具提取成文档。

④@Inherited
@Inherited也是用来修饰其他的Annotation的,被修饰过的Annotation将具有继承性。例如我自定义了@A注解在另一个B类上使用,用@Inherited修饰我的注解,当有C类继承了B类时,C类也将自动拥有我的注解@A

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值