全⾯解析Java注解个⼈博客⽹: (你想要这⾥多有)
⼀、Java注解概述
为什么学习注解?学习注解有什么好处?学完能做什么?
1. 能够读懂别⼈写的代码,特别是框架相关的代码
2. 让编码更加简洁,代码更加清晰
3. 让别⼈⾼看⼀眼
注解的概念: Java提供了⼀种原程序中的元素关联任何信息和任何元数据的途径和⽅法。
⼆、Java中的常见注解
1、JDK中的注解
@Override:⼀般在实现了接⼝的⽅法上标识,作⽤是告诉编译器该⽅法是接⼝的⽅法。
@Deprecated:⼀般在接⼝中的⽅法上进⾏标识,作⽤是该⽅法过时了。
@Suppvisewarnings:忽视警告,@SuppressWarnings("deprecation")
创建⼀个Java⼯程来详细说明:
创建⼯程为AnnTest.java:
创建Person.java类:
public interface Person
{
public String name();
public int age();
@Deprecated
public void sing();
jdk怎么使用}
创建Child.java类,并实现Person.java类:
public class Child implements Person {
@Override
public String name() {
return null;
}
@Override
public int age() {
return 0;
}
@Override
public void sing() {
}
}
创建测试类Test.java
public class Test {
public void sing(){
Person p = new Child();
p.sing();
}
}
注意:此时调⽤的sing()会有⼀条横切线标识,标识当前⽅法即将过期或失效。
此时为了解决这个问题,可以在⽅法明上添加⼀个@SuppressWarnings('deprecation')注解,⽤于标识忽略这个警告。
注意:sing()是过期的⽅法,⼀般都是旧版本jdk中使⽤的,在新的jdk版本中虽然还能⽤,但是,类似这样的⽅法⼤部分存在是为了保证其它旧的项⽬能够正常运⾏,⽽新开发的项⽬已经不再使⽤或使⽤
可替代的⽅法
2、Java第三⽅注解
第三⽅的注解(Spring、Mybatis框架中的注解),这些也是⽐较常见的,功能相对也⽐较简单,但是对于编程⽽⾔,⼤⼤的减少代码量,简化了,程序在形式上的编写。
Spring:@Autowired @Service @Repository
@Autowired:可以对成员变量、⽅法和构造函数进⾏标注,来完成⾃动装配的⼯作。通过 @Autowired的使⽤来消除 set ,get⽅法。
⽤法:
public class UserManagerImpl implements UserManager {
@Autowired
private UserDao userDao;
}
@Service:⽤于标注业务层组件。定义某个类为⼀个bean,则在这个类的类名前⼀⾏使⽤@Service("XXX"),就相当于讲这个类定义为⼀个bean,bean名称为XXX。⽽⽆需去xml⽂件内去配置。
@Repository:⽤于标注数据访问组件,即DAO组件。
三、注解的分类
注解的分类:
1、按照运⾏机制分为
源码注解:注解只在源码中存在,编译成.class⽂件就不存在了
编译时注解:注解在源码和.class⽂件中都存在(如:JDK内置系统注解:@Override、@Deprecated、@Suppvisewarnings)运⾏时注解:在运⾏阶段还起作⽤,甚⾄会影响运⾏逻辑的注解(如:Spring中@Autowried,程序运⾏时,把成员变量⾃动注⼊)
2、按照来源分为:
JDK内置系统注解、⾃定义注解、第三⽅注解
3.元注解:
给注解进⾏注解,注解的注解
四、⾃定义注解
1、Java⾃定义注解
【1】、⾃定义注解的语法要求
a、使⽤@interface关键字定义注解
b、成员以⽆参⽆异常⽅式声明
c、可以⽤default为成员指定⼀个默认值
d、如果注解只有⼀个成员,则成员名必须取名value(),在使⽤时可以忽略成员名和赋值
号(=);
e、成员类型是受限的,合法的类型包括原始类型String,Class,Annotation,Enumeration
f、注解类可以没有成员,没有成员的注解称为标识注解
【2】元注解
@Documented ⽣成javadoc时包含注解
@Inherited 允许⼦类继承
@Retention(RetentionPolicy.RUNTIME):声明周期
[SOURCE只在源码显⽰,编译时会丢弃;
CLASS编译时会记录到class中,运⾏时忽略;
RUNTIME运⾏时存在,可以通过反射读取]
@Target({ElementType.METHOD})
[CONSTRUCTOR构造⽅法声明;
FIELD字段声明;
LOCAL_VARIABLE局部变量声明;
METHOD⽅法声明;
PACKAGE包声明;
PARAMETER参数声明;
RYPE类接⼝]
2、使⽤⾃定义注解
⾃定义注解的使⽤
@<;注解名>(<;成员名1>=<;成员值1>,<;成员名1>=<;成员值1>,...)
⽰例:
@Description(desc="I am eyeColor",author="Mooc boy,age=18)
public String eyeColor(){
return "red";
}
@Description注解在eyeColor()⽅法上使⽤。
3、关于⾃定义注解的代码演⽰说明
⾃定义注解时,如果注解只有⼀个成员,则成员名必须为value(),在使⽤是可以忽略成员名称赋值号(=)
【1】. 虽然
public @interface Description{
String desc();
}
@Description(desc="the name method")
不会报错。
但不符合规范,既然只有⼀个成员,就要使⽤value作为成员名,改成:
public @interface Description{
String value();
}
然后在使⽤注解的时候,直接赋值,不写成员名和等号:
@Description("the name method")
以上⽅式,约定俗成,⽐较直观。
【2】. 没有成员的注解——标志注解(⽐如常见的@Override),在使⽤的时候不加括号。
【3】. 当⼀个⽅法被规定为({ElementType.METHOD})就表⽰只能⽤于⽅法的注解,如果⽤在类上⾯,就会报错(添加
ElementType.TYPE 则可适⽤于类)。这⾥没有包含关系,例如只写ElementType.TYPE 则不能对⽅法进⾏注解,只能对类或接⼝进⾏注解。
【4】. @Documented(属于标识注解,⽣成javadoc时会包含注解)
创建⼀个Javadoc :右击项⽬--> Export --> Java --> Javadoc --> next -->Browser 选择要存放的⽂件夹。点击finish就⽣成成功了。
打开这个⽂件夹,点击index.html,就能查看该项⽬的⼀些摘要。
4、解析注解
概念:通过反射获取类、函数或成员的运⾏时注解信息,从⽽实现动态控制程序运⾏的逻辑。
@Inherited 只能实现类的继承,⽽接⼝是⽆法继承的。即接⼝的注解⽆法影响到实现接⼝的类上⾯。另外,⽗类的⽅法的注解也⽆法被⼦类继承。
核⼼代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论