Java中反射技术点记录

为了避免遗忘,将Reflect中常用方法和步骤记录下来。
  1. 测试所用的person类如下:
package neuq.test;

public class Person {
	private String name;
	private int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person(){
		super();
	}
	public static void staticMethod(){
		System.out.println("staticMethod run!!");	
	};
	
	public void paramMethod(String name,int age){
		System.out.println(name+"--------"+age);
	}
	public void noParamMethod(){
		System.out.println("noParamMethod run!!!!");
	}
}

2.JUnit测试代码如下:
package neuq.test;

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

import org.junit.Test;

public class ReflectTest {
	
	/*
	 * 测试拿到Class的三种方法
	 * 
	 * @author:Dean
	 * @data:2014-6-23
	 */
	@Test
	public void testGetClass() throws ClassNotFoundException{
		//方法一:一般不用
		Person p=new Person();
		Class c1=p.getClass();
		//方法二:很少用
		Class c2=Person.class;
		//方法三:常用
		String className="neuq.test.Person";
		Class c3=Class.forName(className);
		
		System.out.println(c1);
		System.out.println(c2);
		System.out.println(c3);
	}
	
	/*
	 * 测试通过指定的构造器实例化对象。
	 * @author:Dean
	 * @date:1994-6-23
	 * 
	 */
	
	@Test
	public void testGetSpecifiedConstructor() throws 
	ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException,
	IllegalAccessException, IllegalArgumentException, InvocationTargetException{
		//通过类名拿到Class
		String className="neuq.test.Person";
		Class clazz=Class.forName(className);
		//通过Class对象拿到Constructor,并制定参数类型。
		Constructor constructor=clazz.getConstructor(String.class,int.class);
		//通过Constructor实例化对象。
		Person p=(Person) constructor.newInstance("Dean",20);
		
		System.out.println(p);
	}
	
	
	/*
	 * 测试反射字段的方法&以及暴力访问
	 * 
	 * @author:Dean
	 * @date:2014-6-23
	 */
		@Test
		public void testGetField() throws Exception{
			//首先拿到Class对象,并实例化
			String className="neuq.test.Person";
			Class clazz=Class.forName(className);
			Constructor constructor=clazz.getConstructor(String.class,int.class);
			Object obj=	constructor.newInstance("Dean",20);
			
			/*
			 * 拿到字段,并设置值
			 * 私有属性只能根据getDeclaredXXX()拿到。否则会出NoSuchXXX异常
			 */
			Field field=clazz.getDeclaredField("name");
			String value="Sam";
			
			//暴力访问私有属性,设置可访问性。
			field.setAccessible(true);
			field.set(obj, value);
	}
		
		
		
		/*
		 *测试反射 静态方法 带参数的方法 不带参数的方法
		 * @ staticMethod()
		 * @	paramMethod()
		 * @	noParamMethod()
		 * 
		 * @author:Dean
		 * @date:2014-6-23
		 */
		@Test
		public void testGetMethod() throws Exception{
			//先拿到Class的对象
			String className="neuq.test.Person";
			Class clazz=Class.forName(className);
			Constructor constructor=clazz.getConstructor(String.class,int.class);
			Object obj=constructor.newInstance("Dean",20);
			
			//先测试静态方法,不需要实例化对象
			Method method1=clazz.getMethod("staticMethod");
			method1.invoke(null, null);
			
			//测试无参数方法,需要实例化对象,不需要指定参数
			Method method2=clazz.getMethod("noParamMethod");
			method2.invoke(obj, null);
			
			//测试带参数方法,需要实例化对象,需要指定参数
			Method method3=clazz.getMethod("paramMethod", String.class,int.class);
			method3.invoke(obj, "Sam",20);
		}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值