反射的一个测试案例

本文详细介绍Java反射机制的应用,包括如何获取Class对象、调用构造方法创建对象、获取并操作类属性及方法等核心操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值