package util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import test.web.example.PP;
/**
*
* @author peidw
*
*/
public class Reflection {
/**
* 取得参数对象中的公共属性
* @param obj
* @param fieldname
* @return
* @throws Exception
*/
public Object getProperty(Object obj,String fieldname)throws Exception{
Object result=null;
Class objClass=obj.getClass();
Field field=objClass.getField(fieldname);
result=field.get(obj);
return result;
}
/**
* 获得某类的静态属性
* @param className
* @param fieldName
* @return
* @throws Exception
*/
public Object getStaticProperty(String className,String fieldName)throws Exception{
Class cls=Class.forName(className);
Field field=cls.getField(fieldName);
Object provalue=field.get(cls);
return provalue;
}
/**
* 获取参数对象的属性值
* @param obj
* @param propertyName
* @return
* @throws Exception
*/
public Object getPrivatePropertyValue(Object obj,String propertyName)throws Exception{
Class cls=obj.getClass();
Field field=cls.getDeclaredField(propertyName);
field.setAccessible(true);
Object retvalue=field.get(obj);
return retvalue;
}
/**
* 执行某对象的方法
* @param owner
* @param methodName
* @param args
* @return
* @throws Exception
*/
public Object invokeMethod(Object owner,String methodName,Object[] args)throws Exception{
Class cls=owner.getClass();
Class[] argclass=new Class[args.length];
for(int i=0,j=argclass.length;i<j;i++){
argclass[i]=args[i].getClass();
}
Method method=cls.getMethod(methodName,argclass);
return method.invoke(owner, args);
}
/**
* 执行静态类的方法
* @param className
* @param methodName
* @param args
* @return
* @throws Exception
*/
public Object invokeStaticMethod(String className,String methodName,Object[] args)throws Exception{
Class cls=Class.forName(className);
Class[] argclass=new Class[args.length];
for(int i=0,j=argclass.length;i<j;i++){
argclass[i]=args[i].getClass();
}
Method method=cls.getMethod(methodName,argclass);
return method.invoke(null, args);
}
public Object newInstance(String className,Object[] args)throws Exception{
Class clss=Class.forName(className);
Class[] argclass=new Class[args.length];
for(int i=0,j=argclass.length;i<j;i++){
argclass[i]=args[i].getClass();
}
java.lang.reflect.Constructor cons=clss.getConstructor(argclass);
return cons.newInstance();
}
public static void main(String[] args)throws Exception{
Reflection rl=new Reflection();
PP p=new PP();
rl.getPrivatePropertyValue(p,"aname");
}
}
测试类
package test.web.example;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.Assert.*;
import util.Reflection;
/**
*
* @author peidw
*
*/
public class ReflectionTest {
private PP pp=null;
private Reflection reflection=null;
@Before
public void setUp() throws Exception {
reflection=new Reflection();
pp=new PP();
}
@Test
public void testGetProperty() throws Exception{
System.out.println(pp);
System.out.println(reflection);
System.out.println(reflection.getProperty(pp, "address"));
//assertEquals(reflection.getProperty(pp, "address"), null);
}
@Test
public void testGetStaticProperty()throws Exception{
assertEquals(reflection.getStaticProperty("test.web.example.PP", "count"),"love you");
}
@Test
public void testGetPrivatePropertyValue() throws Exception{
assertEquals(reflection.getPrivatePropertyValue(pp, "aname"),null);
}
@Test
public void testInvokeMethod() throws Exception{
assertEquals(reflection.invokeMethod(pp, "setAddress", new Object[]{"合浦西场镇"}),null);
assertEquals(reflection.getProperty(pp, "address"), "合浦西场镇");
}
@Test
public void testInvokeStaticMethod()throws Exception {
assertEquals(reflection.invokeStaticMethod("test.web.example.PP", "changeCount",new Object[]{"80"}),true);
assertEquals(reflection.getStaticProperty("test.web.example.PP", "count"),"80");
}
@Test
public void testNewInstance() throws Exception{
Object vpp=reflection.newInstance("test.web.example.PP",new Object[]{"peidw","广州"});
org.junit.Assert.assertNotNull(vpp);
//assertEquals(reflection.getPrivatePropertyValue(vpp,"aname"),"peidw");
}
}
posted on 2007-08-29 20:47
有猫相伴的日子 阅读(10381)
评论(2) 编辑 收藏 所属分类:
jdk