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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一碗小米周 于 2013-12-13 20:27 编辑
  1. import java.beans.PropertyDescriptor;
  2. import java.lang.reflect.Method;

  3. //获取Point类中的属性值,并设置。
  4. public class PointTest {
  5.         public static void main(String[] args) throws Exception{
  6.                 Point pt = new Point(3, 5);
  7.                 String propertyName="x";
  8.                 //获取x值。             如果想获取x的值,为什么不直接用pt.getX()呢?这样不是更方便吗?为什么要用下面这种方式呢?请教各位。
  9.                 PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt.getClass());
  10.                 Method getMethod = pd.getReadMethod();
  11.                 Object retVal = getMethod.invoke(pt);  
复制代码

  1. public class Point {
  2.         private int x;
  3.         private int y;
  4.         public Point(int x,int y){
  5.                 this.x=x;
  6.                 this.y=y;
  7.         }
  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.         
  21. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

3 个回复

正序浏览
这应该用到的是反射机制。就是说,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
我是这么想的,并非所有的代码都是开源的,这种情况下如果你不会反编译,那么你只有通过字节码文件,获取其中的属性,使用属性描述 PropertyDescriptor,通过字节码文件对象得到其中的属性 propertyName。
getReadMethod();这个获取属性的方法,Object retVal = getMethod.invoke(pt);  这句话意思是,使用invoke实现字节码对象中封装的属性方法,在未知返回值类型的情况下将类型定义为Object

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
一开始的时候,我也存在这样的想法,现在慢慢有了一些理解:
我个人感觉之所以用这种方式,和反射是一样的。在能更改源码的情况下,你希望这里可以实现几个不同.class文件的对象中的同名的方法,你只要创建不同类对象就可以了;但是遇到不能更改源码但是又需要根据不同情况使用不同的JavaBean,这种方法就行不通了。
但是可以采用配置文件的形式。将类名、属性名等信息配置进去,在源程序中预留接口对象。根据多态的性质,只要是实现了该接口的对象,都可以通过更改配置文件名称的方式,动态地加载进程序,就有了一定的扩展性,也一定程度上避免了更改源程序可能引起错误的情况。
我的理解就是这样,具体应用还不太多,更深层次的还没有想到。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

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