设为首页 加入收藏

TOP

Java反射机制浅析(二)
2015-11-10 13:45:41 来源: 作者: 【 】 浏览:18
Tags:Java 反射 机制 浅析
name;
? ? }
? ?
? ? @SuppressWarnings("unused")
? ? private void setId(int id) {
? ? ? ? this.id = id;
? ? }
? ?
? ? public int getId() {
? ? ? ? return id;
? ? }
? ?
? ? @Override
? ? public String toString() {
? ? ? ? return "id:" + id + ", name:" + name;
? ? }
?
}


?测试类


import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
?
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
?
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
?
public class ReflectTest {
? ?
? ? Class clazz;
? ?
? ? /**
? ? * className = "包名.类名"
? ? */
? ? String className = "reflect.Reflect";
? ?
? ? @Before
? ? public void before() {
? ? ? ? try {
? ? ? ? ? ? clazz = Class.forName(className);
? ? ? ? } catch (ClassNotFoundException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ?
? ? @After
? ? public void after() {
? ? ? ? clazz = null;
? ? }
? ?
? ? @Test
? ? public void testConstructor() {
? ? ? ? try {
? ? ? ? ? ? /**
? ? ? ? ? ? * 获取无参构造器
? ? ? ? ? ? */
? ? ? ? ? ? Constructor constructor = clazz.getConstructor();
? ? ? ? ? ? Object obj = constructor.newInstance();
? ? ? ? ? ? Method method = clazz.getMethod("getName");
? ? ? ? ? ? assertThat((String)method.invoke(obj), containsString("Tom"));
? ? ? ? ? ? /**
? ? ? ? ? ? * 获取带参构造器
? ? ? ? ? ? */
? ? ? ? ? ? constructor = clazz.getConstructor(String.class);
? ? ? ? ? ? obj = constructor.newInstance("Jack");
? ? ? ? ? ? assertThat((String)method.invoke(obj), containsString("Jack"));
? ? ? ? ? ? /**
? ? ? ? ? ? * 获取多个参数构造器
? ? ? ? ? ? */
? ? ? ? ? ? constructor = clazz.getConstructor(int.class, String.class);
? ? ? ? ? ? obj = constructor.newInstance(6, "Rose");
? ? ? ? ? ? method = clazz.getMethod("toString");
? ? ? ? ? ? assertThat((String)method.invoke(obj), allOf(containsString("id:6"), containsString("name:Rose")));
? ? ? ? } catch (NoSuchMethodException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (SecurityException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (InstantiationException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IllegalAccessException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (IllegalArgumentException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } catch (InvocationTargetException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ?
? ? }
? ?
}


Field


  Field类是对Java普通类中的属性或者称字段的抽象。通过Class类的getFields()方法可以取得表示字段的对象的数组,通过getField(String name)获取给定名称的字段的对象,如果字段修饰符为private或protected,则getField()方法会抛出java.lang.NoSuchFieldException异常。对于非公有的属性的设定,可以使用getDeclaredField()方法,并调用setAccessible(true),使属性可获得。



测试方法


@Test
public void testField() {
? ? try {
? ? ? ? /**
? ? ? ? * Class类的newInstance()方法会调用默认构造函数创建一个实例对象
? ? ? ? */
? ? ? ? Object obj = clazz.newInstance();
? ? ? ? Method method = clazz.getMethod("getName");
? ? ? ? assertThat((String)method.invoke(obj), containsString("Tom"));
? ? ? ? /**
? ? ? ? * 设定private属性的值
? ? ? ? */
? ? ? ? Field field = clazz.getDeclaredField("name");
? ? ? ? field.setAccessible(true);
? ? ? ? field.set(obj, "Jack");
? ? ? ? assertThat((String)method.invoke(obj), containsString("Jack"));
? ? ? ? /**
? ? ? ? * 设定public属性的值
? ? ? ? */
? ? ? ? field = clazz.getField("id");
? ? ? ? field.setInt(obj, 9);
? ? ? ? method = clazz.getMethod("getId");
? ? ? ? assertThat(String.valueOf(method.invoke(obj)), containsString("9"));
? ? } catch (InstantiationException e) {
? ? ? ? e.printStackTrace();
? ? } catch (IllegalAccessException e) {
? ? ? ? e.printStackTrace();
? ? } catch (NoSuchMethodException e) {
? ? ? ? e.printStackTrace();
? ? } catch (SecurityException e) {
? ? ? ? e.printStackTrace

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇JavaScript基本类型及类型转换 下一篇C++基于TCP和UDP的socket通信

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: