反射和内省

package com.itludan.demo.reflect; 

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

/**
 * @author 64229
 *反射的测试
 *反射的目的是为了操作某个类的属性或方法
 */
public class ReflectDemo {

	private Field[] fields;

	@Test
	/**
	 * 获得代表这个类加载到内存的字节码文件的对象Class对象.
	 */
	public void demo1() throws ClassNotFoundException{
		// 通过类名获取
		Class clazz = Person.class;
		
		// 通过类的实例对象获取
		Person person = new Person();
		Class clazz2 = person.getClass();
		
		// 通过Class.forName静态方法获取
		Class clazz3 = Class.forName("com.itludan.demo.reflect.Person");
	}
	
	@Test
	/**
	 * 通过反射操作其构造方法:
	 * DBUtils: Person person = queryRunner.query(sql,new BeanHanlder(Person.class));
	 */
	public void demo2() throws Exception{
		// 反射第一步获得Class对象.
		Class clazz = Class.forName("com.itludan.demo.reflect.Person");
		
		// 采用默认的无参数的构造方法创建:
		Person p  = (Person) clazz.newInstance();
		p.drink();
		
		// 采用有参数的构造方法来创建对象
		Constructor constructor = clazz.getConstructor(String.class,Integer.class);
		Person p1 = (Person) constructor.newInstance("w岩",28);
		System.out.println(p1.age);
	}
	
	@Test
	/**
	 * 通过反射获得类中的属性:
	 */
	public void demo3() throws Exception{
		// 获得Class对象
		Class clazz =Class.forName("com.itludan.demo.reflect.Person");
		
		// 获得私有的属性
		Field field1 = clazz.getDeclaredField("name");
		field1.setAccessible(true);
		
		Field field2 = clazz.getField("age");

		Constructor c = clazz.getConstructor(String.class,Integer.class);
		Person p  = (Person) c.newInstance("w岩",28);
		String name = (String) field1.get(p);
		Integer age = (Integer) field2.get(p);
		System.out.println(name);
		System.out.println(age);
	}
	
	@Test
	/**
	 * 通过反射获得类中的方法:并且让方法执行.
	 * 
	 */
	public void demo4() throws Exception{
		// 获得Class对象
		Class clazz = Class.forName("com.itludan.demo.reflect.Person");
		
		// 获得类中的方法:
		Method method = clazz.getDeclaredMethod("drink");
		method.setAccessible(true);
		method.invoke(clazz.newInstance());
		
		// 获取有参构造方法
		Method method2 = clazz.getDeclaredMethod("sayByebye", String.class);
		String s = (String)method2.invoke(clazz.newInstance(),"w岩");
		System.out.println(s);
		
	}
}


猜你喜欢

转载自blog.csdn.net/ludadan/article/details/80372570