1. 注解基礎理解
注解是一類特殊的類壮锻,在類聲明、方法聲明倍靡、參數(shù)列表等位置添加注解,并結合代理等設計模式课舍,可以提高代碼的可讀性塌西,簡化代碼等
2. 注解的定義
注解的定義形似接口,具體如下:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Charger {
String name();
String hobby() default "ppp";
}
需要注意
- interface前面加@符號
- 屬性的定義要求定義為方法筝尾,(具體的設計思路還不清楚)
- 屬性的類型可以為下述幾種之一
- 8種原生類型:int,short,float,double,boolean,byte,char,long
- String
- Class(包括可選的形參捡需,例如Class<? extends Person>)
- enum枚舉類型
- 注解類型
- 上述幾種類型的數(shù)組,例如String[],但是數(shù)組的數(shù)組是不允許的
- @Target注解指定此注解可以使用的位置
- @Retention注解指定此注解的聲明周期
- 注解暗中繼承了java.lang.annotation.Annotation接口筹淫,因此注解也是一種特殊的對象站辉,有自己特殊的equals,hashcode方法等的實現(xiàn),具體見下面的解釋
- 注解成員變量名為value時,使用時可省略value=
2.1 注解的equals
兩個注解對象equals返回true损姜,當且僅當注解的成員全部互相equals時,測試代碼如下,Charger注解定義如上
public class EqualsTest {
@Charger(name = "aa")
public void method1(){}
@Charger(name = "bb")
public void method2(){}
@Charger(name = "aa")
public void method3(){}
@Charger(name = "aa", hobby = "daa")
public void method4(){}
public static void main(String[] args) throws NoSuchMethodException {
Class<? extends EqualsTest> clazz = EqualsTest.class;
Annotation charger1 = clazz.getMethod("method1").getAnnotation(Charger.class);
Annotation charger2 = clazz.getMethod("method2").getAnnotation(Charger.class);
Annotation charger3 = clazz.getMethod("method3").getAnnotation(Charger.class);
Annotation charger4 = clazz.getMethod("method4").getAnnotation(Charger.class);
System.out.println("1=2?"+charger1.equals(charger2));
// false
System.out.println("1=3?" + charger1.equals(charger3));
// true
System.out.println("1=4?" + charger1.equals(charger4));
// false
}
}
2.2 注解的hashCode
注解的hashCode按下述方法計算:
- 注解的hashCode=各成員的特殊hashCode之和
- 成員的特殊hashCode=成員的方法名按String.hashCode()方法得到的值*127以后歧蕉,XOR成員的值的特殊hashCode
- 成員的值的特殊hashCode計算方法為:當不為數(shù)組類型時委煤,hashCode為調用此值的hashCode()方法的結果,當為數(shù)組時棒卷,hashCode為調用對應的java.util.Arrays#hashCode方法的返回值顾孽,具體使用那個算法取決于數(shù)組內存儲的類型,Array類中比规,針對不同的原生類型和對象類型有不同的重載實現(xiàn)方式