黑馬程式員:Java基礎總結
java注解
ASP.Net+Android+IO開發
、
.Net教育訓練
、期待與您交流!
@SuppressWarnings
通過System.runFinalizersOnExit(true);的編譯警告引出@SuppressWarnings("deprecation")
@Deprecated
直接在剛才的類中增加一個方法,并加上@Deprecated标注,在另外一個類中調用這個方法。
@Override
public boolean equals(Reflect other)方法與HashSet結合講解
總結:
注解相當于一種标記,在程式中加了注解就等于為程式打上了某種标記,沒加,則等于沒有某種标記,以後,javac編譯器,開發工具和其他程式可以用反射來了解你的類及各種元素上有無何種标記,看你有什麼标記,就去幹相應的事。标記可以加在包,類,字段,方法,方法的參數以及局部變量上。
看java.lang包,可看到JDK中提供的最基本的annotation。
注解的應用結構
//定義一個注解類
@interface
annotation
{
}
//應用了“注解類”的類
@annotation
class
B{}
//對“應用了注解類的類”進行反射操作的類
c{
{
annotation
.
.isAnnotation();}
{B.
class
.isAnnotationPresent(
);}
.getAnnotation(
.
<code> boolean</code>
<code>isAnnotation()</code>
如果此 Class 對象表示一個注釋類型則傳回 true。
<code>isAnnotationPresent(Class<? extends Annotation> annotationClass)</code>
如果指定類型的注釋存在于此元素上,則傳回 true,否則傳回 false。
<code><A extends Annotation> A</code>
<code>getAnnotation(Class<A> annotationClass)</code>
如果存在該元素的指定類型的注釋,則傳回這些注釋,否則傳回 null。
<code> Annotation[]</code>
<code>getAnnotations()</code>
傳回此元素上存在的所有注釋。
自定義注解
元注解
Documented
訓示某一類型的注釋将通過 javadoc 和類似的預設工具進行文檔化。
Inherited
訓示注釋類型被自動繼承。
Retention
訓示注釋類型的注釋要保留多久。
Target
訓示注釋類型所适用的程式元素的種類。
<code> RetentionPolicy</code>
<code>value</code>
<code>CLASS</code>
編譯器将把注釋記錄在類檔案中,但在運作時 VM 不需要保留注釋。
<code>RUNTIME</code>
編譯器将把注釋記錄在類檔案中,在運作時 VM 将保留注釋,是以可以反射性地讀取。
<code>SOURCE</code>
編譯器要丢棄的注釋。
RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别對應:java源檔案-->class檔案-->記憶體中的位元組碼。
@Retention
(RetentionPolicy.
SOURCE
)
思考: @Override、@SuppressWarnings和@Deprecated 對應的是
SOURCE,
SOURCE ,
RUNTIME
<code> ElementType[]</code>
<code>ANNOTATION_TYPE</code>
注釋類型聲明
<code>CONSTRUCTOR</code>
構造方法聲明
<code>FIELD</code>
字段聲明(包括枚舉常量)
<code>LOCAL_VARIABLE</code>
局部變量聲明
<code>METHOD</code>
方法聲明
<code>PACKAGE</code>
包聲明
<code>PARAMETER</code>
參數聲明
<code>TYPE</code>
類、接口(包括注釋類型)或枚舉聲明
@Target
(value = { ElementType.
TYPE
, ElementType.
METHOD
}) //常用
注解增加屬性
定義基本類型的屬性和應用屬性:
在注解類中增加String color();
@MyAnnotation(color="red")
用反射方式獲得注解對應的執行個體對象後,再通過該對象調用屬性對應的方法
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以認為上面這個@MyAnnotation是MyAnnotaion類的一個執行個體對象
為屬性指定預設值:
String value()
default
"default"
;
value屬性可簡寫:
String value() default "zxx";
如果注解中有一個名稱為value的屬性,且你隻想設定value屬性(即其他屬性都采用預設值或者你隻有一個value屬性),那麼可以省略value=部分,例如:@MyAnnotation("lhm")。
數組類型的屬性
int [] arrayAttr() default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果數組屬性中隻有一個元素,這時候屬性值部分可以省略大括
枚舉類型的屬性
EnumTest.TrafficLamp lamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
注解類型的屬性:
MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
可以認為上面這個@MyAnnotation是MyAnnotaion類的一個執行個體對象,同樣的道理,可以認為上面這個@MetaAnnotation是MetaAnnotation類的一個執行個體對象,調用代碼如下:
MetaAnnotation ma = myAnnotation.annotationAttr();
System.out.println(ma.value());
import
java.lang.annotation.Retention;
java.lang.annotation.RetentionPolicy;
java.lang.annotation.Target;
java.lang.annotation.ElementType;
(lap = Lap.
YELLOW
, value =
"default"
public
Ts0 {
static
void
main(String[] args)
throws
Exception {
if
(Ts0.
)) {
anno = (
) Ts0.
);
System.
out
.println(anno.order().value());
}
}
// 定義一個注解類
})
String value();
int
[] arr()
{ 1, 2, 3 };
Lap lap();
orAnno
order()
@orAnno
(
"123"
enum
Lap {
RED
,
GREEN
// 另一個注視