新建Person类:
package test.reflection.cal;
import test.reflection.annotation.AnnoTest;
/**
* 用于测试反射的类
* @author Administrator
*
*/
public class Person {
private int id;
private String name;
// public Person(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 待测试的方法
* private 修饰
* 带注解
* @param i
* @return
*/
@AnnoTest(value = "what",name = "are you doing")
private String changeInfo(String i){
return i+" "+name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
新建注解:
package test.reflection.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义注解
* @author Administrator
*
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoTest {
String name() default "this is an annotation";
String value() default "";
}
测试类:
package test.reflection.test;
import java.lang.reflect.Method;
import test.reflection.annotation.AnnoTest;
import test.reflection.cal.Person;
/**
* 反射测试
*
* @author Administrator
*
*/
public class ReflectionTest {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Throwable, SecurityException {
Person p = new Person();
Class<Person> clazz = (Class<Person>) p.getClass();
// 获取所有的方法
Method[] methods = clazz.getDeclaredMethods();
System.out.println("Person 的所有方法:");
for (Method method : methods) {
System.out.println("" + method.getName());
}
System.out.println();
// 获取getName方法,没有赋初值,结果为null
Method m0 = clazz.getDeclaredMethod("getName");
System.out.println("getName: " + m0.invoke(p));
// 获取setName方法
Method mset = clazz.getDeclaredMethod("setName", String.class);
mset.invoke(p, "dam");
System.out.println("setName之后 " + p.toString());
// 获取changeInfo 方法
Method m1 = clazz.getDeclaredMethod("changeInfo", String.class);
m1.setAccessible(true);// changeInfo方法用private修饰 ,这里需要设置为true才能获取
String res = (String) m1.invoke(p, " haha");
System.out.println("changeInfo:" + res);
// 获取changeInfo 方法上的注解
AnnoTest annoTest = (AnnoTest) m1.getAnnotation(AnnoTest.class);
System.out.println(annoTest.name());// 获取注解中的值
System.out.println(annoTest.value());// 获取注解中的值
}
}