黑马程序员技术交流社区
标题:
关于设置SetAccessible的问题
[打印本页]
作者:
张强+
时间:
2011-11-10 21:35
标题:
关于设置SetAccessible的问题
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class IntroSpectorTest {
public static void main(String[] args) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
ReflectPoint p1=new ReflectPoint(3,5);
String properyName="x";
// "x"==>"X"==>"getX"--->MethodGetX-->
Object retVal = getProperty(p1, properyName);
System.out.println(retVal);
setProperty(p1, properyName);
System.out.println(BeanUtils.getProperty(p1, "x").getClass().getName());
BeanUtils.setProperty(p1, "x", "9");
Method method= p1.getClass().getDeclaredMethod("getX",int.class);
method.setAccessible(true);
System.out.println(p1.getX()); //这段代码的问题getX报错,无权访问,问什么,我已经setsetAccessible(true);了呀,private int getX();
/* // java7新特性
// Map map={name:"zxx",age:18};// jdk1.7新特性
// BeanUtils.setProperty(map, "name", "lhm");
*/
BeanUtils.setProperty(p1, "birthday.time", "111" );
System.out.println(BeanUtils.getProperty(p1, "birthday.time"));
PropertyUtils.setProperty(p1, "x", 9);
System.out.println(PropertyUtils.getProperty(p1, "x").getClass().getName());
}
private static void setProperty(ReflectPoint p1, String properyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pd1=new PropertyDescriptor(properyName,p1.getClass());
Method methodSetX=pd1.getWriteMethod();
methodSetX.invoke(p1,7);
}
private static Object getProperty(ReflectPoint p1, String properyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
/* PropertyDescriptor pd=new PropertyDescriptor(properyName,p1.getClass());
Method methodGetX=pd.getReadMethod();
Object retVal=methodGetX.invoke(p1);
return retVal;*/
BeanInfo beanInfo=Introspector.getBeanInfo(p1.getClass());
PropertyDescriptor []pds=beanInfo.getPropertyDescriptors() ;
Object retVal=null;
for (PropertyDescriptor pd : pds) {
if(pd.getName().equals(properyName)){
Method methodGetX=pd.getReadMethod();
retVal=methodGetX.invoke(p1);
break;
}
}
return retVal;
}
}
该贴已经同步到
张强+的微博
作者:
张强+
时间:
2011-11-10 21:36
有什么办法可以做到?
作者:
郭学文
时间:
2011-11-10 22:10
本帖最后由 郭学文 于 2011-11-10 22:11 编辑
Method method= p1.getClass().getDeclaredMethod("getX",int.class);//getX是没有参数的,你这里是在得到一个带参数的getX(int x)的方法
method.setAccessible(true);
System.out.println(p1.getX());另外这里不可以是这样子的,你这样子是直接引用p1的一个私有方法,没有通过反射
应该是method.invoke(p1);
BeanUtils.setProperty(p1, "x", 9);
Method method=p1.getClass().getDeclaredMethod("getX");
method.setAccessible(true);
System.out.print(method.invoke(p1));
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2