Java中的反射机制复习

1 Java反射机制概述

    Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

2 Java反射测试示例

package captain;

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

import org.junit.Test;

//反射,演示反射操作一个类的无参构造函数、有参构造函数、属性、方法。
public class ReflectDemo {
	//利用反射操作无参构造函数
	@Test
	public void test1() throws Exception {
		// 获取一个类的Class对象的三种方式。
		// Class c = Person.class;
		// Class c2 = new Person().getClass();
		Class c3 = Class.forName("captain.Teacher");
		
		/*
		 * 通过Class对象的newInstance方法实例化被反射类,返回值类型是Object。 实际上是调用了被反射类的无参构造方法。
		 */
		Teacher t = (Teacher) c3.newInstance();
		t.setName("zhangsan");
		System.out.println(t.getName());
	}
	
	//利用反射操作有参构造函数
	@Test
	public void test2() throws Exception {
		Class c3 = Class.forName("captain.Teacher");
		//获取指定的有参构造函数对象
		Constructor cs= c3.getConstructor(String.class,String.class);
		Teacher t = (Teacher) cs.newInstance("zhangsan","001");
		System.out.println(t.getName()+" "+t.getId());
	}
	
	//利用反射操作属性(域)
	@Test
	public void test3() throws Exception {
		Class c3 = Class.forName("captain.Teacher");
		Teacher t = (Teacher) c3.newInstance();
		//获取指定的类中声明属性
		Field f = c3.getDeclaredField("name");
		//由于属性name为Teacher类私有的,所以要设置可访问。
		f.setAccessible(true);
		//设置类的一个实例t的name属性的值为"zhangsan"。
		f.set(t, "zhangsan");
		System.out.println(t.getName());
	}
	
	//利用反射操作一般方法
	@Test
	public void test4() throws Exception {
		Class c3 = Class.forName("captain.Teacher");
		Teacher t = (Teacher) c3.newInstance();
		//获取指定的类中声明一般方法。将方法名、方法参数类型作为参数,这样可以确定唯一的一个方法对象。
		Method m = c3.getDeclaredMethod("setId", String.class);
		/*
		 * 执行t对象的setId方法,传入参数值为"001"。
		 * 注意1:若setId方法为私有的,则也要先设置可访问,即m.setAccessible(true);
		 * 注意2:若setId方法为静态的,则不需要类的一个实例,且改为m.invoke(null, "001");
		 */
		m.invoke(t, "001");
		System.out.println(t.getId());
		
	}
}

//Teacher类
class Teacher {
	private String name;
	private String id;

	public Teacher() {
	}

	public Teacher(String name, String id) {
		this.name = name;
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

}


你可能感兴趣的:(Java语言,java)