您的位置:首页 > 编程语言 > Java开发

Java中的反射和内省简单实例

2016-05-22 17:23 555 查看
1.反射和内省   

      反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。

      内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性。

2.反射和内省的图



一个简单的实例:

Person.java

public class Person
{
private Integer id;

private String name;

public Person()
{
super();
}

public Person(Integer id, String name)
{
super();
this.id = id;
this.name = name;
}

public Integer getId()
{
return id;
}

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

public String getName()
{
return name;
}

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

@Override
public String toString()
{
return "Person [id=" + id + ", name=" + name + "]";
}

}

测试类:

public class IntrospectorAndReflect
{
/**
* @throws Exception
* @Description: 使用反射设置值和调用方法
*/
@Test
public void test1() throws Exception
{
Class<?> clazz = Class.forName("com.beanutil.px.Person");
Object obj = clazz.newInstance();
//-----------set value-----------
Field id = clazz.getDeclaredField("id");
id.setAccessible(true);
id.set(obj, 1001);
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(obj, "你好");
//------------get value----------
Method[] methods = clazz.getMethods();
for(Method m : methods)
{
if(m.getName().startsWith("get"))
{
Object v = m.invoke(obj, null);
System.out.println(v);
}
}
}

/**
* @throws Exception
* @Title: test2
* @Description: 使用内省的方式修改属性和调用方法
*/
@Test
public void test2() throws Exception
{
Person p = new Person();
BeanInfo bi = Introspector.getBeanInfo(Person.class);
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for(PropertyDescriptor pd : pds)
{
System.out.println(pd.getName());
}
System.out.println("===================");
//-------------set value----------------
PropertyDescriptor id = new PropertyDescriptor("id", Person.class);
Method wid = id.getWriteMethod();
wid.invoke(p, 1002);

PropertyDescriptor name = new PropertyDescriptor("name", Person.class);
Method wname = name.getWriteMethod();
wname.invoke(p, "hello");
//--------------get value-----------------------
Method gid = id.getReadMethod();
System.out.println(gid.invoke(p, null));
Method gname = name.getReadMethod();
System.out.println(gname.invoke(p, null));

}
/**
*
* @throws Exception
* @throws IllegalAccessException
* @Title: test3
* @Description: 使用Apache-common beanutil框架内部采用内省的方式进行设置和获取
*/
@Test
public void test3() throws Exception
{
Person p = new Person();
BeanUtils.setProperty(p, "id", 1003);
BeanUtils.setProperty(p, "name", "world");
System.out.println(p);
String name = BeanUtils.getProperty(p, "name");
System.out.println("name: "+name);
}
}

PS:使用beanutil需要添加logging的jar包。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: