`

Java 注解

 
阅读更多

看例子 :

   自定义注解:

  

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target ({ElementType.METHOD})
@Retention (RetentionPolicy.RUNTIME) 
public @interface MyTest {
  String value();
}

  

定义注解时,注意几点:

   这两个元注解:

    @Target : 表示在允许在哪里添加注解 方法上面 , 类 ,包, 还是字段!!

    @Retention : 表示什么时候注解发回作用!

        有三种策略:

        Class  : 字节码 , class文件中!

        Source  : 源代码中

        Runtime : 运行的时候

 

使用注解:

  

public class TestClass {
	@MyTest("This is Method 1")
	public String Method1(String s) {
System.out.println(s);
		return s;
	}

	public String Method2(String s) {
System.out.println(s);
		return s;
	}

	@MyTest("This is Method 3")
	public String Method3(String s) {
System.out.println(s);
		return s;
	}

}

 

自定义注解要实现什么功能?

   这里我们只是简单的取得注解中的属性然后输出即可!如果没有被注解标记 就不调用该方法!

 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
// main 方法测试!	
	public static void main(String[] args) throws InstantiationException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException {
		String className = "TestClass";
		getAndPrint(className);
	}
	
// 实现注解的功能!! 通过反射机制
//	通过给定的类名,得到相应的类 及它所有的方法
//	然后检测方法是否被标记,如果标记了就把注解的参数传入并输出!!
//	到此,实现了一个简单的注解!
	static void getAndPrint(String className) throws InstantiationException, IllegalAccessException,
	 IllegalArgumentException, InvocationTargetException, ClassNotFoundException {
		Class c = Class.forName(className);
		Method[] ms = c.getDeclaredMethods();
		for (Method m : ms) {
			// 这个方法是否被注解标记
			if (m.isAnnotationPresent(MyTest.class)) {
				MyTest tc = m.getAnnotation(MyTest.class);
				Object o = c.newInstance();
				String s = tc.value();
				m.invoke(o, s);
			}
		}
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics