黑马程序员技术交流社区

标题: 关于设置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);


  1. BeanUtils.setProperty(p1, "x", 9);
  2.                 Method method=p1.getClass().getDeclaredMethod("getX");
  3.                 method.setAccessible(true);
  4.                 System.out.print(method.invoke(p1));
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2