A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© y510662669 中级黑马   /  2012-11-25 18:13  /  1419 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 y510662669 于 2012-11-26 00:58 编辑

public static void main(String[] args) {
                Student s=new Student();
                try {
                        BeanInfo bi=Introspector.getBeanInfo(s.getClass());
                        PropertyDescriptor pd[]=        bi.getPropertyDescriptors();
                        for(PropertyDescriptor prd:pd){
//                                System.out.println(prd.getName());//不明白这个地方获取名字,获取的是谁的名字,我查API发现PropertyDescriptor

没有这个这个方法,而且我的打印的是age,请高手指点这个地方到底什么意思?
                                

                             Method m=prd.getWriteMethod();

                                if(m.getName().equals("setName")){
                                        m.invoke(s ,"zhangsan");//还有这个反射的invoke到底怎么用来,前两个月学的时候还很明白,现在直接都忘干净了,求高手详细解释?
//                                
                                }
                        }
                        System.out.println(s.getName());
//                        System.out.println(s.getAge());
//                        
                } catch (IntrospectionException e) {
                        e.printStackTrace();
                } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }

        }
还有我的这个也报异常, java.lang.NullPointerException,空指针异常,就是if那个地方有空指针异常。。求指点。。下面是我的javaben类!
public class Student {
        private String name;
        private int age;
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }







评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

2 个回复

倒序浏览
首先我们必须了解内省是做什么的?内省是操作javaBean的,好的这就足够了,那么我们想一下我们怎么去自己来实现?首先得到一个属性!然后操作这个属性,也就是读取和写入!这就够了
来看一下第一句PropertyDescriptor[] pd = bi.getPropertyDescriptors();这得到的是一个属性集合,也就是你的javaBean中有什么属性都打包为PropertyDescriptor对象。由你的javaBean可以看出是String 和name。那么下一句话
for(PropertyDescriptor prd:pd){
              System.out.println(prd.getName());
打印的就是String和name的属性名称了!
下面的Method m=prd.getWriteMethod();//通过反射来获得写函数
                  if(m.getName().equals("setName")){
                     m.invoke(s ,"zhangsan");//invoke是调用的意思,这里就是调用你获得写函数,参数第一个为操作对象是哪个,第二个是写函数的参数,这里你要修改值,所以为“zhangsan”!
空指针异常我就觉得是你的javaBean有问题,你不妨写一个带参的构造函数!如果没有的话new出来的对象成员均为null的。
其实在写程序是要多想如果是我程序怎么写?这样熟悉程序流程,记忆程序原理。如果一味的记忆步骤,就会陷入老是忘的怪圈!这也是我的一点经验,希望有用!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
梁小波 发表于 2012-11-25 18:41
首先我们必须了解内省是做什么的?内省是操作javaBean的,好的这就足够了,那么我们想一下我们怎么去自己来 ...

谢谢大神指点!特别是您的经验!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马