四十一,java中Annotation詳解

1.Annotation簡介

Annotation實際上表示一種註釋的語法,java中最先的程序是提倡代碼與配置相分離,而最新的理論又是將全部的配置直接寫入到程序中去,那麼若是想要完成這樣的功能,則須要使用Annotation. html

JDK1.5以後的新特性:枚舉,自動裝箱拆箱,foreach,可變參數,靜態導入,泛型. java

2.系統內建的Annotation

  • @Override ide

  • @Deprecated 學習

  • @SupressWarnings spa

2.1 @Override

@Override表示正確的覆寫操做. code

示例: orm

父類代碼 htm

public class Person {
    public String say(){
        return "人在說話。" ;
    }
}


子類代碼 :
public class Studnt extends Person {
    @Override
    public String say(){
        return "學生在說話" ;
     }
}

@Override能夠保證正確的覆寫,若是一個方法聲明瞭覆寫,而實際上覆寫有問題就會提示出錯誤. 對象


2.2 @Deprecated

@Deprecated表示不建議使用的操做. 繼承

示例:

public class Info {
    @Deprecated
    public String getInfo(){
        return "hello" ;
    }
}
getInfo這個方法就是不建議使用的操做 ,在代碼中會用中劃線表示警告 ,可是不影響實際使用 .


2.3 @SupressWarnings

@SupressWarnings表示壓制警告.

示例:

public class TestInfo {

	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		new Info().getInfo() ;
	}

}
注意的是 SupressWarnings能夠壓制多個警告 .

示例:

import java.io.Serializable;

@SuppressWarnings({ "serial", "deprecation" })
public class Person extends Info implements Serializable {

}


使用過程當中,能夠明確表示出是爲 SuppressWarnings中的value屬性賦值.

import java.io.Serializable;

@SuppressWarnings(value = { "serial", "deprecation" })
public class Person extends Info implements Serializable {

}




3.自定義Annotation

定義Annotation的語法:

public @Annotation

示例:

public @interface MyAnnotation {

    public String key() ;
    public String value() ;
}
如今若是要使用此 Annotation,不在同一個包中須要導入 ,導入以後使用 @Annotation的訪問語法 .

示例:

@MyAnnotation(key = "ARES", value = "19")
public class Info {
}

:能夠爲Annotation定義默認的屬性.

public @interface MyAnnotation {
	public String key() default "ARES";

	public String value() default "19";
}


Annotation能夠經過枚舉類型制定範圍 .

示例:

Color:

public enum Color {
	RED, GREEN, BLUE;
}
MyAnnotation:
public @interface MyAnnotation {
	public String key() default "ARES";
	public String value() default "19";
	public Color color() default Color.RED ;
}




4.RententionRententionPolicy

java.lang.annotation中定義了全部與之相關的操做,Rentention自己是一個 Annotation,其中的取值是經過RententionPolicy這個枚舉類型制定的.RententionPolicy規定了一下三種範圍:

  • 源碼中起做用:public static final RetentionPolicy SOURCE

  • 編譯後的class中起做用:public static final RetentionPolicy CLASS

  • 運行的時候起做用:public static final RetentionPolicy RUNTIME

若是一個Annotation要起做用,則必須使用RUNTIME範圍.


5.反射與Annotation

一個Annotation要想起做用,則必須依靠反射機制,經過反射機制能夠取得一個方法在Annotation上聲明的所有內容.

取得所有的Annotation.

示例:

import java.lang.annotation.*;
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	public String key() default "ARES";
	public String value();
}

Info:

package com.ares.demo;
public class Info {
	@Override
	@Deprecated
	@SuppressWarnings(value = "")
	@MyAnnotation(key = "ARES", value = "19")
	public String toString() {
		return "hello";
	}
}
以上三個 Annotation,只有 @Deprecated RUNTIME範圍的 .因此運行時 ,只有運行時只有 @Deprecated 能夠取到 .

示例:

package com.ares.demo;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class ClassAnnotationDemo {

	public static void main(String[] args) throws Exception {
		Class<?> cls = Class.forName("com.ares.demo.Info");
		Method toStringMethod = cls.getMethod("toString");
		Annotation ans[] = toStringMethod.getAnnotations();// 取得所有的Annotation
		for (int i = 0; i < ans.length; i++) {
			System.out.println(ans[i]) ;
		}
	}

}




6.自定義RUNTIMEAnnotation

示例:

package com.ares.demo12;

import java.lang.annotation.*;
@Documented
@Target(value = { ElementType.METHOD, ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	public String key() default "ARES";

	public String value() default "ARES";
}

經過反射取得Annotation:

package com.ares.demo;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class ClassAnnotationDemo {

	public static void main(String[] args) throws Exception {
		Class<?> cls = Class.forName("com.ares.demo.Info");
		Method toStringMethod = cls.getMethod("toString");
		Annotation ans[] = toStringMethod.getAnnotations();// 取得所有的Annotation
		for (int i = 0; i < ans.length; i++) {
			if (toStringMethod.isAnnotationPresent(MyAnnotation.class)) {
				MyAnnotation my = null; // 聲明Annotation的對象
				my = toStringMethod.getAnnotation(MyAnnotation.class) ;
				String key = my.key() ;
				String value = my.value() ;
				System.out.println(key + " --> " + value) ;
			}
		}
	} 
}

實際開發中不用過多關注這些底層的實現,程序中爲其提供支持.



7.Annotation深刻

①自定義Annotation能夠在程序的任意位置使用.

示例:

package com.ares.demo;
@MyAnnotation
public class Info {
	private String name ;
	@MyAnnotation
	public String toString() {
		return "hello" ;
	}
}

:實際上咱們能夠爲Annotation制定使用範圍.

②設置Annotation的使用範圍.(實際有8種範圍,能夠查看手冊)

制定範圍示例:

package com.ares.demo;

import java.lang.annotation.*;

@Target(value = { ElementType.METHOD, ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	public String key() default "ARES";

	public String value() default "ARES";
}

Documented註釋

註釋格式:

package com.ares.demo;

import java.lang.annotation.*;
@Documented
@Target(value = { ElementType.METHOD, ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	public String key() default "ARES";

	public String value() default "ARES";
}

在使用類中加入文檔註釋:

package com.ares.demo;
@MyAnnotation
public class Info {
	private String name ;
	/**
	 * 本方法是覆寫Object類中的toString()方法
	 */
	@MyAnnotation
	public String toString() {
		return "hello" ;
	}
}

用文檔註釋的最大好處是能夠導出doc文檔.相似官方文檔的html格式文檔.



8.Inherited

表示此Annotation可否繼續被子類繼承下去,若是沒有寫上此註釋,表示此Annotation根本就是沒法被繼承的.

示例:

package com.ares.demo;

import java.lang.annotation.*;
@Inherited
@Documented
@Target(value = { ElementType.METHOD, ElementType.TYPE })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	public String key() default "ARES";

	public String value() default "ARES";
}
此時表示能夠被子類繼承 .







20150529


JAVA學習筆記系列

--------------------------------------------

                    聯繫方式

--------------------------------------------

        Weibo: ARESXIONG

        E-Mail: aresxdy@gmail.com

------------------------------------------------
相關文章
相關標籤/搜索