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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.sf.test;

  2. public class TestJavaBeans {

  3.         /**
  4.          * @param args
  5.          */
  6.                 private int x;
  7.                 private int y;
  8.         public int getX() {
  9.                 return x;
  10.         }
  11.         public void setX(int x) {
  12.                 this.x = x;
  13.         }
  14.         public int getY() {
  15.                 return y;
  16.         }
  17.         public void setY(int y) {
  18.                 this.y = y;
  19.         }



  20. }
复制代码
  1. package com.sf.test;

  2. import java.beans.IntrospectionException;
  3. import java.beans.PropertyDescriptor;
  4. import java.lang.reflect.Method;

  5. public class WeekDay {

  6.         /**
  7.          * @param args
  8.          * @throws Exception
  9.          */
  10.         public static void main(String[] args) throws Exception {
  11.                 // TODO Auto-generated method stub
  12.                 String propertyName="x";
  13.                 TestJavaBeans test=new TestJavaBeans();
  14.                 test.setX(4);
  15.                 test.setY(5);
  16.                 PropertyDescriptor properties=new PropertyDescriptor(propertyName, test.getClass());
  17.                 Method getMethod=properties.getReadMethod();
  18.                 System.out.println(getMethod.invoke(test));       
  19.                 Method setMethod=properties.getWriteMethod();
  20.                 setMethod.invoke(test, 10);
  21.                 System.out.println(getMethod.invoke(test));
  22.                 System.out.println(test.getX());
  23.         }

  24. }
复制代码

如上,明明可以直接用test的set和get方法来读和设置值,为什么要弄一大堆先通过PropertyDescriptor获取属性,然后通过属性获得方法,然后再通过反射执行读取和设值方法,我怎么不明白他这么做到底有什么必要呢?求哪位大神帮忙具体说清楚点这么用的好处.

8 个回复

倒序浏览
因为这是为了方便非开发人员或者说是没有源码的人,通过反射可以得到字节码里面的东西
回复 使用道具 举报
左脑想你 发表于 2014-9-1 16:52
因为这是为了方便非开发人员或者说是没有源码的人,通过反射可以得到字节码里面的东西 ...

额,还是没懂,你的那个情形是什么情形,能不能结合上面两种代码描述具体点,我比较笨。
回复 使用道具 举报
yjiang_09 发表于 2014-9-1 17:09
额,还是没懂,你的那个情形是什么情形,能不能结合上面两种代码描述具体点,我比较笨。 ...

没有java文件的情况下只给你class文件你怎么对文件中的变量设置呢?答案就是反射。。。JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问。javaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。
回复 使用道具 举报
你把get set方法去掉。外部访问私有的成员变量,多个地方多来几次,很明显要方便很多嘛
回复 使用道具 举报
我当初看这儿也没看明白,跟楼主一样的困惑,求大神赐教
回复 使用道具 举报
单线程xia 发表于 2014-9-1 19:07
你把get set方法去掉。外部访问私有的成员变量,多个地方多来几次,很明显要方便很多嘛 ...

get set,方法都没了。用第二种不一样没法访问
回复 使用道具 举报
左脑想你 发表于 2014-9-1 17:35
没有java文件的情况下只给你class文件你怎么对文件中的变量设置呢?答案就是反射。。。JavaBean是一种特 ...

还是没弄清你意思,你意思是没有上面中的TestJavaBeans的java文件只给class文件?然后在WeekDay里test就没法(test.)点出setX和setY方法,是这个意思吗?。
还有个问题,我们是定义了String propertyName="x",这么定义不就是意味着我们知道TestJavaBeans的私有变量是x,但是我们应该是不知道TestJavaBeans里的私有变量啊
回复 使用道具 举报
yjiang_09 发表于 2014-9-1 22:43
get set,方法都没了。用第二种不一样没法访问

暴力反射啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马