java 常見的註解,什麼是註解,自定義註解案例(定義以及使用)模擬Junit

java 自定義註解

1、什麼是註解?

註解和接口,類一樣,都是屬於一種數據類型。
註解可以在變量,方法,類之上加載

註解的作用:
1、編譯檢查
2、配置(分析代碼)
3、生成幫助文檔

註解可以有屬性也可以沒有屬性:
(1)@Override 沒有屬性的註解
(2)@Test(timeout = 1000) 有屬性的 註解
註解是有作用範圍的:
(1)原碼期間有效、String 類之上的@Auther,@see,@since
作用:使用一些命令:javadoc命令將當前的原碼生成幫助文件,可以識別String類上的相關的註解 .chm文件

在這裏插入圖片描述
(2)編譯期間有效、@Override @Overload @Deprecated @Suppresswarning

告訴編譯器的部分信息

(3)運行期間有效、@Test

作用:在當前代碼上以Junit方式運行時,Junit會運行方法上包含@Test註解的方法

//以下註解的含義是:如果當前的方法執行時間超過了1miao,那麼會報錯
	@Test(timeout = 1000)
	public void test03() {
		try {
			Thread.sleep(2000);//讓線程睡2000毫秒
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("test");
	}

JDK當中常見的幾種註解:
@Override @Overload @Deprecated @Suppresswaring
以下代碼對應相關作用

//以下註解的函含義是:聲明當前方法是重寫父類的方法
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString();
	}
	public void test01() {
		//以下註解的函含義是:抑制編譯器發生警告類的信息
		@SuppressWarnings("unused")
		int i;
		//以下註解的函含義是:抑制編譯器發生警告類的信息(如果有變量未使用,未遵循泛型格式,不報警告)
		@SuppressWarnings({ "unused", "rawtypes" })
		List a = new ArrayList();
	}
	//以下註解的函含義是:聲明以下的方法是過時的方法,不建議大家使用
	@Deprecated
	public void test02() {		
	}

自定義註解

自定義註解格式:

public @interface 註解名稱{	
	public 屬性類型  屬性名稱();//給註解定義一個屬性
	//如果需要設置默認值defualt 默認值
	public 屬性類型  屬性名稱() default 默認值;
}
//這種情況報錯:原因是因爲屬性不支持自定義類的類型
	public TestAnnotation aa();

屬性類型的範圍:only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof--->只允許基元類型、字符串、類、註釋、枚舉或其一維數組

使用註解
自定義註解屬性支持類型:

基本數據類型(4種8種),
String,Class,Annotation(註解類型),枚舉類型 以及以上類型的一維類型


//自定義一個註解
public @interface MyAnno01 {
	//在註解當中定義一個屬性
	public long timeout() default -1;//給註解定義一個屬性	default -1   默認給賦予一個值	
	//這種情況報錯:原因是因爲屬性不支持自定義類的類型
	//public TestAnnotation aa();	
	//註解的屬性支持的類型有:基本數據類型(4類8種),比如String Class Annotation(註解類型),枚舉類型,以及以上類型的一維數組類型
	public Class c() default java.util.Date.class;
	public String str();
	public MyAnno02 ma();//註解類型的註解屬性
	public String[] strs();
}
public @interface MyAnno02 {

}

註解作用: 配置作用

配置:開發的時候部分信息不希望寫死在程序中,例如數據庫的用戶名和密碼,可以將用戶名和密碼存放在.txt , .properties , .xml 文件中,利用程序來讀取文件中的內容

框架:一大堆工具類組合,目的:加速項目開發
後期,框架部分hibernate,spring,struts2很多信息需要配置,提供了2種形式配置
(xml,註解)

什麼時候用註解來做配置?
1、如果配置信息不會發生的修改,例如servlet路徑,建議使用註解的形式

部分代碼

/**
 * Servlet implementation class ServletDemo02
 */
//網頁訪問對應的類,會找下面這條語句對應的類,然後通過反射來調用裏面的類
@WebServlet("/ServletDemo02")
@WebInitParam(name="username,value="tom")
public class ServletDemo02 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

在這裏插入圖片描述
2、如果配置信息需要發生頻繁的修改,例如數據庫的用戶名密碼信息,
建議採用傳統方法 (.txt , .properties , .xml)
xml配置的信息有廣到精確

<students>
  <stu>
   <stuNum>s002</stuNun>
   <stuPhone>
      <stuHomePhone>124324</stuHomePhone>
      <stuCmpPhone>12342143</stuCmpPhone>
   </stuPhone>
  </stu>
</students>

測試使用自定義註解

@MyAnno01(timeout=100,c=java.util.Date.class,strs={"aaa","bbb"})
public void test01(){
}

通過反射讀取字節碼上的註解信息

  md.isAnnotationPresent(MyTest.class)

* 自定義註解並對其進行使用

1、自定義一個註解


public @interface MyAnno01 {
	// 在註解當中定義一個屬性
	public long timeout() default -1;// 給註解定義一個屬性 default -1 默認給賦予一個值
	// 這種情況報錯:原因是因爲屬性不支持自定義類的類型
	// public TestAnnotation aa();
	// 註解的屬性支持的類型有:基本數據類型(4類8種),比如String Class Annotation(註解類型),枚舉類型,以及以上類型的一維數組類型
	public Class c() default java.util.Date.class;
	public String[] strs();
}

2、對註解進行應用(測試使用自定義的註解)

//測試使用自定義註解
public class TestUserAnnotation {
	@MyAnno01(timeout=100,c=java.util.Date.class,strs= {"aaa","bbb"})
	public void test01() { }
}
//測試使用自定義註解
public class TestUserAnnotation {
	@MyAnno01(timeout=100,c=java.util.Date.class,strs= {"aaa","bbb"})
	public void test01() { }
}
案例 自定義註解案例(定義以及使用)模擬Junit

1、自定義註解@MyTest
注意註解的作用域及其目標對象
通過元註解@Rentention @Target 聲明當前註解作用域以及目標對象,如果沒有聲明在運行期間是無法獲取到註解的信息的
RetentionPolicy.RUNTIME設置當運行的時候找的是UserDao的字節碼文件
2、定義UserDao
創建4個方法addUser delUser upUser getUser,在前三個方法上加註解
3、定義類MyJunit,模擬JUnit
將UserDao.class文件加載到內存當中,獲取到字節碼文件上所有的方法,遍歷方法,判斷每一個方法上是否加載了@MyTest註解,如果當前 方法上設置了@MyTest,如果有就執行對應註解的方法

//自定義一個註解,相當於JUnit@Test
//定義註解的時候,需要通過元註解@Retention來說明白當前自定義的註解作用域(Class,Source,Runtime)
//RetentionPolicy.RUNTIME設置這個註解在運行期間有效,如果不設置可能會通過反射無法獲取到對應的內容
@Retention(RetentionPolicy.RUNTIME)
//自定義註解的時候,需要通過元註解Target說明當前的自定義註解作用目標對象
@Target(ElementType.METHOD)
public @interface MyTest {
	//在MyTest註解當中定義一個成員屬性,默認值爲-1
	public long timeout() default  -1;
}

使用註解

public class UserDao {
	static {
		System.out.println("加載靜態代碼塊");
	}
	@MyTest
	public void addUser() {
		System.out.println("增加用戶");
	}
	@MyTest
	public void delUser() {
		System.out.println("刪除用戶");
	}
	@MyTest
	public void uptUser() {
		System.out.println("更新用戶");
	}
	public void getUser() {
		System.out.println("獲取用戶");
	}
}

通過反射獲取對應的註解

package com.itzheng.test02;

import java.lang.reflect.Method;

public class MyJunit {

	public static void main(String[] args) throws Exception {
		//加載UserDao.class字節碼文件當中的方法,判斷哪些方法上有自定義的註解@MyTest,如果當前的方法有@MyTest,就執行,否則就不執行
		
		//1、將UserDao.class字節碼文件加載到內存中,clazz對象(代表字節碼文件在內存當中的對象)
		Class clazz = Class.forName("com.itzheng.test02.UserDao");//通過反射獲取到對應的類
		//2、獲取字節碼對象上所有的方法,返回Method的數組對象,數組當中的每一個元素都代表Method的對象(相當於字節碼上的每一個方法)
		Method[] methods = clazz.getMethods();//獲取對應類當中對應的方法
		//3、遍歷字節碼對象上所有的方法
		for(Method md : methods) {
			//測試方法的名稱
			//System.out.println(md.getName());
			//判斷當前方法上是否有@MyTest註解信息
			//System.out.println(md.isAnnotationPresent(MyTest.class));
			//isAnnotationPresent判斷方法當中有沒有這個註解
			if(md.isAnnotationPresent(MyTest.class)) {
				md.invoke(new UserDao());//通過判斷是否有對應的註解來獲取對應的方法
			}
			
			//如果當前的方法上有@MyTest註解,執行,否則就忽略
		}
	}
}

Java 相關環境設置

環境設置

安裝操作系統,安裝備份(鏡像)
JDK:設置環境變量
Eclipse:解壓即可
Ecilpse自身解壓目錄不包括中文
代碼工作空間目錄不包括中文
Tomcat:解壓不要包含中文目錄
MySql:安裝:選擇編碼 utf8

設置Eclipse
1、關聯Tomcat
開發過程當中,環境發送變化(重新關聯tomcat),
刪除servers窗口下的tomcat
Project Explorer 窗口下的server
重新關聯widows—>preferences----->servers---->runtime----->tomcat

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章