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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 刘春发 于 2012-6-14 22:26 编辑

public Object setProperty(Object obj,String propertyName,Object value) throws IntrospectionException,
  IllegalArgumentException, IllegalAccessException, InvocationTargetException{
  PropertyDescriptor pd = new PropertyDescriptor(propertyName,obj.getClass());
  Method method = pd.getWriteMethod();
  method.invoke(obj, value);
  return obj;
}//这个是内省?
public Object setProperty2(Object obj,String propertyName,Object value) throws IllegalArgumentException,
  IllegalAccessException, SecurityException, NoSuchFieldException {
  Field field = obj.getClass().getDeclaredField(propertyName);
  field.setAccessible(true);
  field.set(obj, value);
  return obj;
}//这个是反射?

还是有点糊涂,内省和反射的作用到底是什么?

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
反射作用:实现了动态访问java类的方法,可以获取和设置类的属性,可以通过类的实例对象调用方法,可以创建类的实例。
内省:获取javabean类的属性信息,并可以对属性设值。内省是在反射的基础上完成的,所以内省能做的只通过反射也能做。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
反射其实就是程序能够自检查自身信息。就像程序会照镜子反光看自己。

在程序中可以检查某个类中的方法属性等信息,并且能够动态调用。
这样可以写出很灵活的程序。
比如要把一个对象中的数据copy到另外一个对象中,规则是属性名相同就copy,
就可以用反射来做,不需要指定每个属性的名字,只要动态从类中取得信息,
再判断属性名是否相同即可。当然应用还有很多。

反射可以结合Java的字节码,使用ASM和cglib等库,还能动态生成类。
hibernate的延迟载入,spring的AOP都是这么实现的

反射给Java带来了一些动态性。不过虽然很好,但毕竟还是有一定局限性的。另外ASM,cglib使用还是不放便。因此一些纯动态语言现在是一个重要发展趋势,比如ruby,python等,程序很容易动态生成。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
上面两段代码应该是张孝祥老师java高新中举的例子吧。。

只能说这两个例子分别用了反射和内省。。楼主不要认为这就是什么什么。。

首先搞清楚这两个概念:
反射:简单的说就是将java类中的各个部分映射成对应的java类。
      好吧。。当你看到这个概念的时候理解不了什么意思太正常了。。
      只要对这个概念有个初步的印象就往下学吧。。当你把关于反射的被频全看完了。。可能还是没搞清楚,,实际上这也很
      正常。。再看一遍绝对有不同的理解。。。在这里我只跟你说:为什么要出现反射呢?为了定义框架,,为什么定义框架
      要用到反射呢?因为在定义框架的时候我们还不知道用我们框架实战中出现的类名、方法名等等。。就象你定义个方法在
      在不知道参数里可以写个Object一个意思。。剩下的自已去理解吧。
内省  就是API对JavaBean进行一系列操作提供的标准方法。
     简单说。。实际上就是在符合JavaBean的基础上做出来的一套方法。。前提是这些个类需要符合javaBean。

张老师讲的视频有时候看两遍也不一定能搞懂。。多看就明白是什么意思了。。我觉得如果让毕老师来讲这部分课可能就好懂多了。。。各有千秋吧。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马