注解类代码,注解的属性可以有多个:
package reflect; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /*** * java注解默认只会保留在字节码文件里面 * 运行期间注解会被抹掉 * 可以用@Retention来指定注解的保留时间 * 注: * @Retention是元注解,即用来解释其他注解的注解 * Retentionpolicy.RUNTIME是表示注解保留到运行时。 * @author zlq1252 * */ @Retention(RetentionPolicy.RUNTIME) public @interface Test { /* * 注解的属性
*
*注解可以有多个属性。
*如果属性名为value时,可以不制定属性名(只有一个属性时) */ public String value(); }
方法类,在方法类的方法上加上注解代码如下:
package reflect; public class C { public void f1() { // TODO Auto-generated method stub System.out.println("C'S f1"); } @Test(value="淡淡") public void hello() { // TODO Auto-generated method stub System.out.println("C'S hello"); } @Test(value="洋洋") public void bala() { // TODO Auto-generated method stub System.out.println("C'S bala"); } }
反射类代码,通过反射类获得所有具有代码注解的方法并执行,同时可以过的注解的属性:
package reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Scanner; public class TestCase3 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); String className = sc.nextLine(); Class clazz = Class.forName(className); Object obj = clazz.newInstance(); Method[] methods = clazz.getDeclaredMethods(); for(Method mh:methods){ //获得加在方法前面的@Test Test test = mh.getDeclaredAnnotation(Test.class); System.out.println("@Test:"+test); //执行带有注解的方法 if(test!=null){ mh.invoke(obj); //读取@Test的属性值 String v1 = test.value(); System.out.println("@Test的属性值:"+v1); } } } }