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