import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
/**
* 反射的测试的案例:
* @author admin
* 反射的目的是为了操作某个类的属性或方法
*
*/
public class ReflectDemo1 {
@Test
/**
* 获得代表这个类加载到内存的字节码文件的对象Class对象.
*/
public void demo1() throws ClassNotFoundException{
// 一种:通过类名.class
Class clazz1 = Person.class;
// 二种:通过类的实例对象.getClass()方法获得.
Person person = new Person();
Class clazz2 = person.getClass();
// 三种:使用Class的forName的静态方法获得.(推荐使用这种)
Class clazz3 = Class.forName("com.xxxxx.demo3.reflect.Person");
}
@Test
/**
* 通过反射操作其构造方法:
* DBUtils: Person person = queryRunner.query(sql,new BeanHanlder(Person.class));
*/
public void demo2() throws Exception{
// 反射第一步获得Class对象.
Class clazz = Class.forName("com.xxxxx.demo3.reflect.Person");
// 采用默认的无参数的构造方法创建:
// Person person = (Person) clazz.newInstance();
// person.run();
// 采用有参数的构造方法来创建对象:Person p = new Person("张森",38);
Constructor c = clazz.getConstructor(String.class,Integer.class);
Person p = (Person) c.newInstance("张森",38);
System.out.println(p.name);
System.out.println(p.age);
}
@Test
/**
* 通过反射获得类中的属性:
*/
public void demo3() throws Exception{
// 反射第一步获得Class对象.
Class clazz = Class.forName("com.xxxxx.demo3.reflect.Person");
// 获得属性:
// 以下两种仅仅获得共有的属性:
// clazz.getField("name"); // 获得某个属性
// Field[] fields = clazz.getFields(); // 获得所有属性
// 获得私有的属性: p.name =
Field field1 = clazz.getDeclaredField("name");
field1.setAccessible(true);
Field field2 = clazz.getDeclaredField("age");
field2.setAccessible(true);
Constructor c = clazz.getConstructor(String.class,Integer.class);
Person p = (Person) c.newInstance("张森",42);
String name = (String) field1.get(p);
Integer age = (Integer)field2.get(p);
System.out.println(name+" "+age);
}
@Test
/**
* 通过反射获得类中的方法:并且让方法执行.
*
*/
public void demo4() throws Exception{
// 反射第一步获得Class对象.
Class clazz = Class.forName("com.xxxxx.demo3.reflect.Person");
// 获得类中的方法:
Method method = clazz.getDeclaredMethod("run");
method.setAccessible(true);
method.invoke(clazz.newInstance());// p.run();
// 获得带有参数的方法:
Method method2 = clazz.getDeclaredMethod("sayHello", String.class);
String s = (String) method2.invoke(clazz.newInstance(), "凤姐"); // String s = p.sayHello("凤姐");
System.out.println(s);
}
}