Java中的反射机制复习

来源:互联网 发布:淘宝哪家情侣装好看 编辑:程序博客网 时间:2024/05/23 00:59

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 {//利用反射操作无参构造函数@Testpublic 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());}//利用反射操作有参构造函数@Testpublic 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());}//利用反射操作属性(域)@Testpublic 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());}//利用反射操作一般方法@Testpublic 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;}}


0 0