黑马程序员技术交流社区

标题: 用BeanUtils操作javaBean出错 [打印本页]

作者: Jeik    时间: 2014-11-2 13:23
标题: 用BeanUtils操作javaBean出错
public class ReflectBeanUtils {
    public static void main(String[] args) {
    Dog dog=new Dog();
      try {
           BeanUtils.setProperty(dog, "name", "阿忠");
           Object o=BeanUtils.getProperty(dog, "name");
           System.out.println(o.toString());
       } catch (Exception e) {
           e.printStackTrace();
         throw new RuntimeException(e);
      }
  }
}

报错:说是我的javaBean中没有setName方法: 但是我的却是有的。
java.lang.reflect.InvocationTargetException: Cannot set name
at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1013)
at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:454)
at cn.reflect.ReflectBeanUtils.main(ReflectBeanUtils.java:15)
Caused by: java.lang.NoSuchMethodException: Property 'name' has no setter method in class 'class cn.reflect.Dog'

作者: 79819275    时间: 2014-11-2 13:23
应该是因为你的class  不是public属性的,你是不是把Dog类写到内部的,
你另外开个单独类写Dog就可以了
一定要是public class Dog
作者: 79819275    时间: 2014-11-2 16:15
补充图片

作者: Jeik    时间: 2014-11-2 16:59
这是说JavaBean类必须是public吗?
作者: 79819275    时间: 2014-11-2 17:14
Jeik 发表于 2014-11-2 16:59
这是说JavaBean类必须是public吗?

不是这个意思, 你是用别人开发的工具,应该是工具类的一些规定,具体的为什么要public的 只有去阅读他的源码了。
作者: 79819275    时间: 2014-11-2 17:50
Jeik 发表于 2014-11-2 16:59
这是说JavaBean类必须是public吗?

如果类不声明为public的 跨包是没办法访问的,
作者: Jeik    时间: 2014-11-2 18:16
不是这个问题 我就定义成内部类,通过外部类引用构建javaBean对象,还是不能访问。
作者: 79819275    时间: 2014-11-2 19:22
Jeik 发表于 2014-11-2 18:16
不是这个问题 我就定义成内部类,通过外部类引用构建javaBean对象,还是不能访问。 ...

你还是没懂我的意思, BeanUtils工具要求你的类必须是public公有的,因为它是反射调用,他不知道你是不是在同包,所以要求必须是公有属性,如果不是公有属性,则无法调用
作者: 79819275    时间: 2014-11-2 19:24
Jeik 发表于 2014-11-2 18:16
不是这个问题 我就定义成内部类,通过外部类引用构建javaBean对象,还是不能访问。 ...

反正你就记住要用beanUtils这个工具类,必须要求JavaBean对象是公有属性的,否则你就不要用了
作者: Jeik    时间: 2014-11-2 19:52
楼上的哥们 我已近知道什么了!是第三方jar的关系。通过BeanUtils最终会调用到如下的一个方法:
  // If the class is public, we are done
        if (Modifier.isPublic(clazz.getModifiers())) {
            if (!sameClass && !Modifier.isPublic(method.getDeclaringClass().getModifiers())) {
                setMethodAccessible(method); // Default access superclass workaround
            }
            return (method);
        }
这就是原因。当我们的javaBean不是public的时候,肯定找不到method,所以调用它的上层就报错,说找不到setter方法。
作者: 79819275    时间: 2014-11-2 20:00
Jeik 发表于 2014-11-2 19:52
楼上的哥们 我已近知道什么了!是第三方jar的关系。通过BeanUtils最终会调用到如下的一个方法:
  // If th ...

我不早给你说了,是工具类要求的么,
作者: 79819275    时间: 2014-11-2 22:10
Jeik 发表于 2014-11-2 19:52
楼上的哥们 我已近知道什么了!是第三方jar的关系。通过BeanUtils最终会调用到如下的一个方法:
  // If th ...

说这么多,你还是舍不得把5个B给我?
作者: Jeik    时间: 2014-11-2 22:48
刚进来我的黑马币已近扣了呀!你想多了。黑马币是我给的么?不会弄 昨天才弄了博客。
作者: 79819275    时间: 2014-11-3 09:46
Jeik 发表于 2014-11-2 22:48
刚进来我的黑马币已近扣了呀!你想多了。黑马币是我给的么?不会弄 昨天才弄了博客。 ...

智商捉急啊
作者: shuixi_xian    时间: 2014-11-5 22:19
顶。。。




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