java 註解 通常用於項目中的配置,項目中一些不常變的量,比如說功能變數名稱等,還可以用於裝飾者模式 ...
java--註解
通常用於項目中的配置,項目中一些不常變的量,比如說功能變數名稱等,還可以用於裝飾者模式
eg:自定義註解
//在定義註解的時候,需要通過元註解Retention說明當前自定義註解的作用域(Class, Source, Runtime)
@Retention(RetentionPolicy.RUNTIME)
//自定義註解的時候需要使用Target說明當前的自定義註解的作用範圍
@Target(ElementType.METHOD)
public @interface MyAnnotation {
public long timeout() default -1;
// 不支持自定義類型
//public MyAnn01 aa();
public Class c() default java.util.Date.class;
}
//自定義註解的使用
public class TestUserAnnotation {
static{
System.out.println("載入靜態代碼段");
}
@MyAnnotation(timeout = 100)
public void test01(){
System.out.println("test01");
}
@MyAnnotation(timeout = 100)
public void test02(){
System.out.println("test02");
}
@MyAnnotation(timeout = 100)
public void test03(){
System.out.println("test03");
}
@MyAnnotation(timeout = 100)
public void test04(){
System.out.println("test04");
}
public void test05(){}
}
//調用使用了自定義註解的類
public class MyJunit
{
private static Method[] methods;
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
// 載入TestUserAnnotation.class 位元組碼文件中的方法,判斷哪些方法上有自定義的註解,如果有,就執行這個方法
//1_將TestUserAnnotation.class 位元組碼載入到記憶體,class對象(代表位元組碼對象在記憶體中的對象)
Class clazz = Class.forName("com.zhujie.TestUserAnnotation");
//2_獲取位元組碼對象上所有的方法,放回Methods數組對象,數組中每一個元素都代表Method對象(相當於位元組碼中的一個方法)
methods = clazz.getMethods();
//3_遍歷方法
for(Method md:methods)
{
//測試方法的名稱
//System.out.println(md.getName());
//判斷當前方法上是否有@MyAnnotation 註解信息
//System.out.println(md.isAnnotationPresent(MyAnnotation.class));
//有就執行,否則忽略
if(md.isAnnotationPresent(MyAnnotation.class))
{
md.invoke(new TestUserAnnotation());
}
}
}
}