黑马程序员技术交流社区

标题: java内省操作困惑?求大神指点! [打印本页]

作者: y510662669    时间: 2012-11-25 18:13
标题: java内省操作困惑?求大神指点!
本帖最后由 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;
        }








作者: 梁小波    时间: 2012-11-25 18:41
首先我们必须了解内省是做什么的?内省是操作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的。
其实在写程序是要多想如果是我程序怎么写?这样熟悉程序流程,记忆程序原理。如果一味的记忆步骤,就会陷入老是忘的怪圈!这也是我的一点经验,希望有用!
作者: y510662669    时间: 2012-11-25 19:25
梁小波 发表于 2012-11-25 18:41
首先我们必须了解内省是做什么的?内省是操作javaBean的,好的这就足够了,那么我们想一下我们怎么去自己来 ...

谢谢大神指点!特别是您的经验!




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