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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 厦门校区   /  2018-5-12 15:02  /  11668 人查看  /  97 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

黄志彬
        反射在运行时我们可以获取任意一个类的所有方法和属性,可以调用任何一个类的方法和属性,包含私有成员。
                        反射的前提:获取字节码对象(Class)
                        获取字节码对象的方式有三种
                                1通过object的getClass方法   必须要有对象
                                2通过类名获取字节码对象    需要有类名
                                3Class里面的一个静态方法   forName(String className)  需要全类名  更为灵活,推荐使用
                               
        通过反射获取构造方法
                        Class.getConstructors()  返回所有public修饰的构造方法,以数组的方式返回
                        Class.getConstructor()   获取无参构造   只能获取某一个构造
                        Class.getConstructor()   获取有参构造   数据类型要跟成员匹配
                       
        newInstance()创建对象的快捷方法  只能通过空参的构造方法创建对象               
       
        setAccessible(true);调用该方法可以忽略JVM的检查
       
       
        BeanUtils        简化javaBean封装数据的操作。
        BeanUtils的setProperty和getProperty方法底层不是直接操作成员变量,而是操作和变量名有关的get,set方法
        static void        populate(Object bean, Map properties)//// 给JavaBean对象的成员变量进行赋值
回复 使用道具 举报
渣.. 中级黑马 2018-5-12 23:23:09
62#
柯威龙
反射是java虚拟机在运行的时候,对于任何一个类都能够调用他的任意一个方法.
反射主要的是有一个暴力反射 setAccessible(true)
字节码我也不知道没搞懂是什么 只知道有三种获取方式
1:对象名.getClass获取
2.类名.class
3.class.forName(包名.类名)
构造方法
Constructor<?>[] getConstructors():这个构造方法是获取类中的构造方法然后返回一个数组
Constructor<T> getConstructor(Class<?>... parameterTypes) :接受一个可变的参数,然后可以根据串进去的类型来判断使用的构造方法
成员方法,与成员变量应该就是获取成员方法的对象和值.
成员方法有根据方法名返回Method对象:Method getMethod(String name,class<>...parameterTypes)
根据指定的参数和方法名返回Method对象:Field getDeclaredField(String name)
获取所有的成员变量包含私有的:Field[] getDeclaredFields()
根据指定的参数,获取public修饰的字段:Field getField(String name)

javaBean就是用来封装数据的,让反射更简便
BeanUtils最常用的有三个方法,三个方法都是用static静态来修饰的:
static void  setProperth(Object bean, String name, Object value)
Object bean:需要设置属性的对象
String name 需要修改的属性名称
Object value 需要修改的具体元素
static String getProperty(Object bean, String name)
Object bean 要获取的javaBean对象
String name 对象中的某个属性
static void populate(Object bean, Map properties)
Object bean 设置属性的对象
Map properties 将属性以Map集合的的形式传入
回复 使用道具 举报
郑志祥
1.【理解】阐述什么是反射机制
答;可以通过反射获取所有的构造方法与成员变量,成员方法
【应用】阐述什么是字节码对象、以及获取的三种方式
答;        1.Class clazz = s.getClass();        对象.getClass()
2.Class clazz2 = Student.class;      类名.class;
3.forName(String className)      (包名加类名,也叫全类名)
【应用】通过反射操作构造方法、成员方法、成员属性
字节码对象.getConstructor()  是用来获取构造方法的
1.无参数   Constructor c= 字节码对象.getConstructor()
2.有参   Constructor c= 字节码对象.getConstructor(参数类型.class,...  )
3.无参与有参 Constructor[] cs = clazz.getConstructors();
4.//调用方法
        Method m=clazz.getMethod("show1"); 如果方法里面的返回值  都用Object
将有参与无参都放在数组cs  在遍历数组(都是public 修饰,才可以访问)
【理解】阐述JavaBean的作用
答;只需要知道类名不用知道类里面的内容,就可以直接操作类里面的内容,多写或则少写,系统不会报错.
【应用】独立使用BeanUtils工具类
答;跟之前编写的学生类差不多.
【应用】独立编写MyBeanUitls工具类
答;跟之前测试不一样之处,   
1.获取字节码对象(三种)  
2.创建对象是用对象.newInstance()
3.创建集合,与集合联合使用
4.BeanUtils.populate(object, map); ,(对象,集合)
5.调用BeanUtils特有的方法
回复 使用道具 举报
黄进安:

字节码对象Class获取反射的对象:  
1.直接通过字节码对象clazz.newInstance();获取无参构造方法(最为便捷的方式).
2.先通过class获取构造方法(有参无参取决于是否传入参数),再通过构造方法.newInstance();获取.

关于获取所有和获取指定对象:
eg: Field[] getFields() 与 Field getField(String name)
名词+s 在英语单词通常代表复数(多个)的意思;
所以无论的在获取反射的构造方法-成员变量-成员方法在获取所有与指定对象的区别在方法名都有直接的体现

获取私有的成员变量和成员方法甚至构造方法:
要记得设置反射时取消Java的访问检查,暴力访问,eg: filed.setAccessible(true); method. .setAccessible(true);

BeanUtils工具类的一些理解:
方法:BeanUtils.populate(要操作对象,map对象)
利用map对象的key的唯一性(每个成员变量也是唯一存在的)和key与value的一一对应关系(利用给定value的值给key,即成员变量赋值),简化了对对象元素的赋值操作
回复 使用道具 举报
黄志彬
        反射在运行时我们可以获取任意一个类的所有方法和属性,可以调用任何一个类的方法和属性,包含私有成员。
                        反射的前提:获取字节码对象(Class)
                        获取字节码对象的方式有三种
                                1通过object的getClass方法   必须要有对象
                                2通过类名获取字节码对象    需要有类名
                                3Class里面的一个静态方法   forName(String className)  需要全类名  更为灵活,推荐使用
                               
        通过反射获取构造方法
                        Class.getConstructors()  返回所有public修饰的构造方法,以数组的方式返回
                        Class.getConstructor()   获取无参构造   只能获取某一个构造
                        Class.getConstructor()   获取有参构造   数据类型要跟成员匹配
                       
        newInstance()创建对象的快捷方法  只能通过空参的构造方法创建对象               
       
        setAccessible(true);调用该方法可以忽略JVM的检查
       
       
        BeanUtils        简化javaBean封装数据的操作。
        BeanUtils的setProperty和getProperty方法底层不是直接操作成员变量,而是操作和变量名有关的get,set方法
        static void        populate(Object bean, Map properties)//// 给JavaBean对象的成员变量进行赋值       
回复 使用道具 举报
本帖最后由 COLDER 于 2018-10-18 19:08 编辑


一.什么是反射?
反射能否理解为是基于字节码文件进行的一种反编译操作(反编译工具)??也就是一种逆向的思维,通过字节码对象和方法的结合来获取字节码文件中的成员数据.

二.反射操作构造方法,成员变量,方法
反射对构造方法,成员变量,方法的操作是否可以理解为也是”增删改查”中修改与获取的另外一种形式表达?
操作步骤: 获取 --- 修改 --- 输出
注意点: 进行暴力反射需要设置访问权限,跳过JVM访问检查.void setAccessible(boolean flag)

三.JavaBean(封装数据)
JavaBean与创建对象类的区别:使用JavaBean需要实现序列号接口(Serializable),JavaBean无带参构造.

四.BeanUtils和myBeanUtils
BeanUtils可以理解为是使用别人已经编写好的工具包
MyBeanUtils可以理解为是对工具包底层的方法进行了解和根据自己的需求进行重新编写.
回复 使用道具 举报
叶凌青
【理解】阐述什么是反射机制
反射:1.出现反射是因为后面框架的底层全部借助反射来完成,学习反射能让我们更好地对以后的内容进行理解
     2.感觉就是为了强行获取字节码对象的成员
【应用】阐述什么是字节码对象、以及获取的三种方式
字节码对象,应该就是.class文件,
     获取字节码对象的3种方式
      1.对象.getClass
      2.类名.class
      3.class.forName("全类名")
【应用】通过反射操作构造方法、成员方法、成员属性
Field[] getDeclaredFields() //获取所有的成员变量 包含私有
Constructor c = clazz.getConstructor(String.class,int.class);//获取有参构造,参数1类型为String,参数2类型为int
Method getMethod(String name, Class<?>... parameterTypes)  
【理解】阐述JavaBean的作用
感觉和普通类没什么区别,多实现了一个序列化接口
目的是为了让数据增加持久性,也就是说实现序列化接口的类是可以用对象流写入文件的
独立使用BeanUtils工具类
【应用】独立使用BeanUtils工具类
static void        setProperty(Object bean, String name, Object value)// 给JavaBean对象的成员变量进行赋值
static String        getProperty(Object bean, String name) // 获取JavaBean对象的成员变量的值
static void        populate(Object bean, Map properties)//// 给JavaBean对象的成员变量进行赋值
     
回复 使用道具 举报
叶凌青
【理解】阐述什么是反射机制
反射:1.出现反射是因为后面框架的底层全部借助反射来完成,学习反射能让我们更好地对以后的内容进行理解
     2.感觉就是为了强行获取字节码对象的成员
【应用】阐述什么是字节码对象、以及获取的三种方式
字节码对象,应该就是.class文件,
     获取字节码对象的3种方式
      1.对象.getClass
      2.类名.class
      3.class.forName("全类名")
【应用】通过反射操作构造方法、成员方法、成员属性
Field[] getDeclaredFields() //获取所有的成员变量 包含私有
Constructor c = clazz.getConstructor(String.class,int.class);//获取有参构造,参数1类型为String,参数2类型为int
Method getMethod(String name, Class<?>... parameterTypes)  
【理解】阐述JavaBean的作用
感觉和普通类没什么区别,多实现了一个序列化接口
目的是为了让数据增加持久性,也就是说实现序列化接口的类是可以用对象流写入文件的
独立使用BeanUtils工具类
【应用】独立使用BeanUtils工具类
static void        setProperty(Object bean, String name, Object value)// 给JavaBean对象的成员变量进行赋值
static String        getProperty(Object bean, String name) // 获取JavaBean对象的成员变量的值
static void        populate(Object bean, Map properties)//// 给JavaBean对象的成员变量进行赋值
     
回复 使用道具 举报
林荣彬

反射机制就是当程序运行时,我们可以任意的调用一个对象的所有方法和属性

字节码获取有三总方式:
(1)通过对象名  .getclass()  在对象已经存在的情况下可以使用此方式,通过Object的getclass()方法获取
(2)通过类名  .class    只要知道类名就可以获取
(3)通过Class.forName(“全类名(包名+类名)”)    在不知道类名的情况下可获取

通过获取的对象创建对象:
(1)步骤;获得class对象-----获得构造-----通过构造获得实例化对象
(2)构造方法:
(1)Constructor<?>[] getConstructors() 获取该类中所有的构造方法, 返回的是一个数组
(2)Constructor<T> getConstructor(Class<?>... parameterTypes) 接受一个可变参数(可以传参数也可以不传), 可以根据传入的类型, 来匹配对应的构造方法
(3)快速的创建无参构造:Object obj = clazz.newInstance(); 是属于Class对象里面的不是Constructor里的

获取public成员变量:
(1)Field[] getFields()   获取所有公共的成员变量  返回对象数组
(2)Field getField(String name)    获取指定的成员变量 返回成员变量对象

获取private成员变量:
(1)Field[] getDeclaredFields()   暴力反射获取所有字段(包括私有) ,返回对象数组
(2)Field getDeclaredField(String name)  暴力反射获取所有字段(包括私有),返回成员变量对象

Field中的方法:
(1)Object get(Object obj)  通过对象获取成员变量的值
(2)void set(Object obj, Object value)   通过成员变量对象,修改为指定的值
(3)setAccessible(true)    设置反射时取消Java的访问检查,暴力访问

反射获取成员方法  
Method getMethod(String name, Class<?>... parameterTypes)  可空参可无参
Method:
Object invoke(Object obj, Object... args)  可空参可无参

static void    setProperty(Object bean, String name, Object value)    用来给对象中的属性赋值
static String getProperty(Object bean, String name)    用来获取对象中的属性
static void    populate(Object bean, Map properties) 用来给对象中的属性赋值   属性是以Map集合的形式传入
   
注意:BeanUtils的setProperty和getProperty方法底层并不是直接操作成员变量,而是操作和成员变量名有关的get和set方法
回复 使用道具 举报
谢洪彬:
     
   关键字:   反射   ,    BeanUtils

   反射的作用: 不用创建类的对象,可以利用三种方法获取字节码对象从而创建类的对象

反射基本知识内容:
          
           1.获取类中所有的构造方法
           2.获取类中所有的成员变量
           3.获取类中所有的成员方法
    
           以上反射所用到的类基本都是Class中的,基本都是静态方法,直接类名调用    

   成员变量和成员方法也分public修饰的和非public修饰的
          1.利用Class调用方法获取非public修饰的变量或方法,Class的方法名当中都含有Declared单词,
          2.调用非public修饰的必须调用方法获取权限(也称暴力反射)       方法名:setAccessible(true)   

  BeanUtils
         概念: 封装数据
         重要方法: static void populate(Object bean, Map properties)
         此方法主要是利用class字节码对象获取对应类的对象和Map集合一起进行操作.
回复 使用道具 举报
今天在轩哥的认真教导下,我发现反射是一个很神奇的东西,他能非常暴力的访问到另一个类里的成员变量,成员方法,及构造方法;
还学习了字节码对象,知道了很多方法都需要调用字节码对象的方法来获取.
创建字节码对象有三种方式:
类名.class
Class.forName(全类名)
对象名.getClass()
反射操作构造方法、成员方法、成员属性有哪些?
所有方法都要用调用字节码对象的方法获取
Constructor c = clazz.getConstructor(String.class,int.class);//获取有参构造                        Object obj = c.newInstance("lisi",30); 创建对象
Object obj = clazz.newInstance();//快速创建的无参构造
只能获取Public修饰的成员变量:  Field[] getFields() //获取所有公共的成员变量  返回对象数组
Field getField(String name) 获取指定的成员变量 返回字段对象
只能获取private修饰的成员变量: Field[] getDeclaredFields() //获取所有的成员变量 包含私有
  Field getDeclaredField(String name) //获取指定的成员变量 包含私有
                     获取pubic修饰的成员方法:  Method getMethod(String name, Class<?>... parameterTypes)
获取private修饰的成员方法:  Method m = clazz.getDeclaredMethod("setName", String.class)        === m.setAccessible(true);开启暴力反射,就可以执行私有的方法了


你问我JavaBean的作用是什么?
那我就大发慈悲的告诉你吧:JavaBean就是用来封装数据的;
后来又学了BeanUtils工具类
它有三个方法:
setproperty(Object bean, String name, Object valeu)
getproperty(Object bean, String name)
populate(Object bean, Map properties)
虽然这三个方法我也不大会用,但是我还是知道第三个比较重要的,其他两个比较次一点.
最后的时候学了MyBeanUitls自定义工具类
.....在课上看到自定义类我是有点懵的,虽然说现在还是有点懵.但是好歹还是打下来了,哈哈.
回复 使用道具 举报
林玮

今天在轩哥的认真教导下,我发现反射是一个很神奇的东西,他能非常暴力的访问到另一个类里的成员变量,成员方法,及构造方法;
还学习了字节码对象,知道了很多方法都需要调用字节码对象的方法来获取.
创建字节码对象有三种方式:
类名.class
Class.forName(全类名)
对象名.getClass()
反射操作构造方法、成员方法、成员属性有哪些?
所有方法都要用调用字节码对象的方法获取
Constructor c = clazz.getConstructor(String.class,int.class);//获取有参构造                        Object obj = c.newInstance("lisi",30); 创建对象
Object obj = clazz.newInstance();//快速创建的无参构造
只能获取Public修饰的成员变量:  Field[] getFields() //获取所有公共的成员变量  返回对象数组
Field getField(String name) 获取指定的成员变量 返回字段对象
只能获取private修饰的成员变量: Field[] getDeclaredFields() //获取所有的成员变量 包含私有
  Field getDeclaredField(String name) //获取指定的成员变量 包含私有
                     获取pubic修饰的成员方法:  Method getMethod(String name, Class<?>... parameterTypes)
获取private修饰的成员方法:  Method m = clazz.getDeclaredMethod("setName", String.class)        === m.setAccessible(true);开启暴力反射,就可以执行私有的方法了


你问我JavaBean的作用是什么?
那我就大发慈悲的告诉你吧:JavaBean就是用来封装数据的;
后来又学了BeanUtils工具类
它有三个方法:
setproperty(Object bean, String name, Object valeu)
getproperty(Object bean, String name)
populate(Object bean, Map properties)
虽然这三个方法我也不大会用,但是我还是知道第三个比较重要的,其他两个比较次一点.
最后的时候学了MyBeanUitls自定义工具类
.....在课上看到自定义类我是有点懵的,虽然说现在还是有点懵.但是好歹还是打下来了,哈哈.
回复 使用道具 举报
谢洪彬:
     
   关键字:   反射   ,    BeanUtils

   反射的作用: 不用创建类的对象,可以利用三种方法获取字节码对象从而创建类的对象

反射基本知识内容:
          
           1.获取类中所有的构造方法
           2.获取类中所有的成员变量
           3.获取类中所有的成员方法
    
           以上反射所用到的类基本都是Class中的,基本都是静态方法,直接类名调用    

   成员变量和成员方法也分public修饰的和非public修饰的
          1.利用Class调用方法获取非public修饰的变量或方法,Class的方法名当中都含有Declared单词,
          2.调用非public修饰的必须调用方法获取权限(也称暴力反射)       方法名:setAccessible(true)   

  BeanUtils
         概念: 封装数据
         重要方法: static void populate(Object bean, Map properties)
         此方法主要是利用class字节码对象获取对应类的对象和Map集合一起进行操作.
回复 使用道具 举报
反射
在运行时可以获得任何一个类的成员属性和方法,通过暴力反射可以获取类的私有成员;
首先要获取class对象,然后通过获取构造方法获取实例化对象
创建class对象有三种方式,:
1 通过已存在的对象名加上getclass
2通过类名点上class
3是通过class的静态方法 Class.forName 推荐使用这种方法,比较方便点
然后又学了getConstructor()

构造方法可以是有参构造,但实例化是一定要相互匹配上
getDeclaredField(Stringname) --> 暴力反射获取指定名称字段


记得要加dsetAccessible(boolean flag) --> 让jvm不检查权限  不然就获取不到私有的



回复 使用道具 举报
弄了一小时登录终于浮上来了。
姓名:曾耀峰


   今天学的反射真是颠覆三观,通过反射可以获取任意一个类的所有方法和属性,面向对象的引以为傲的三大特征之一是封装。然而在反射面前却毫无反击之力。之前安卓的开发,就有提取过Andorid的字节码文件。通过反射是否可以修改其源代码。进而修改App软件。有破解方法是否有防御之道?为何要设计权限这么大的机制?
   扯远了。有空查查资料。总结一下今天的学习情况。
   
   一、反射:
   1.先晒个概念,理解一下反射是什么以及它的功能:
   1).在程序运行时判断任意一个对象所属的类
   2).在运行时构造任意一个类的对象;
   3).在运行时能判断和获取一个类所具有的成员变量和方法
   4).在运行时能调用任意一个对象的方法和成员
   
   2.如何使用反射,首先利用Class对象,获取目标类名。具体可以通过对象名.类名,通过类名.class,通过Class.forName()等三种方式调用。
   
   3.通过Class对象目标了的获取构造,以及创建对象。有以下方式。
    1)创建无参构造函数时用Class对象的newInstance()方法
      -Class clazz
      -Object obj = clazz.newInstance();

    2)创建有参构造函数使用Constructor对象来创建
     Constructor c = clazz.getConstructor(String.class,in.class); 这里创建出来对象参数1为String类型的变量,参数2为int类型的变量

    3)重点来了,利用反射获取成员(当然也包括私有成员)
      (1)获取成员变量
         [1].获取public成员变量。要利用Class对象的方法 其中都是返回值Field[] 数组,Field对象提供了有关目标类的字段或者信息,以及对它的动态访问权限。例如:
         Field[] getFields()方法:获取所有公共的成员变量,返回对象数组
         Field[] getField(String name) 根据指定的字段名获取成员变量
         Field[] getDeclaredFields() 获取所有的成员变量,包含私有
         Filed getDeclaredField(String name) 获取指定的成员变量,包含私有
         
      (2)获取成员方法:还是使用Class对象的方法:
         [1].获取public成员方法:使用getDelaredMethod(),格式如下:
             Method getMethod(String name,Class<?>...parameterTypes)
         [2].获取private成员方法:
             使用Method  getMethod("setName",String.class) 记得开启权限m.setAccessible(true)方法
         最后使用invoke调用执行反射出来的方法
   
    二、Beans
       Beans听说是学习开源框架经常使用的东西。想想还是很重要的。我们以前经常写的Person,Student等对象可以看作一个bean对象。使用方法是先导入网上下载的Bean jar包。从elispe导入。在build path里面设置变成奶瓶形状就可以使用。
       如果一个对象要做成Bean。和以前我们写的不一样的两个地方,一是实现Serials序列化接口,二是不用提供有参构造函数。
       掌握Beans的三个重要方法:
       static void      setProperty(Object bean,String name,Object value) 利用Bean对象的成员进行赋值
       static String        getProperty(Object bean, String name) // 获取JavaBean对象的成员变量的值
       static void        populate(Object bean, Map properties)//// 给JavaBean对象的成员变量进行赋值
      
       其中使用populate方法能给对象的成员变量进行赋值
       最后学习了如何自己写一个BeanUtils工具类。通过反射能够很容易地写出来
       听说总结不用贴代码。

点评

很不错,能够用自己的语言描述自己的思路,代码的理解不只是简单的应用。更多的是能够用最简单的语言解释清楚最复杂的代码。加油!  发表于 2018-5-14 11:09
不仅仅是概括全面,而是真正思考了学完反射和之前内容的区别所在  发表于 2018-5-13 11:46
回复 使用道具 举报 1 0
本帖最后由 AsusCoder 于 2018-5-13 00:21 编辑

发了两个楼。发了两个楼。发了两个楼。发了两个楼。
回复 使用道具 举报
康元中
  今天学习反射,反射是一种可以动态访问一个类的成员和构造.
第一个重点  掌握如何去访问一个类的构造/方法和变量
    都是通过创建字节码对象 然后通过字节码对象调用一些方法 返回到相对应的字段/ 构造/method
然后要掌握以下的一些方法和类似的区别  
1 getConstructor(String.class,int.class);//获取有参构造,参数1类型为String,参数2类型为int
Object obj = c.newInstance("lisi",30); 创建对 象      
2 Field getField(String name) 获取指定的成员变量 返回字段对象
    Field getDeclaredField(String name) //获取指定的成员变量 包含私有
3 Method m = clazz.getDeclaredMethod("setName", String.class)
    Object invoke(Object obj, Object... args)  
注意 访问私有的变量和成员时要暴力反射 开启setAccessible(true)
第二个重点是 学习Beanutil 这个工具类里面的一些方法  setProperty getProperty 和populate (bean,map)这个方法重要           
   javabean(标准书写规范)
回复 使用道具 举报
16lws
今天学习了反射,反射是java中提供的另一种获取构造方法,成员的暴力机制,它把,构造方法,成员变量,成员方法各自封装成一个独立的类,通过这些封装的类的对象可以对构造方法,成员变量,成员方法进行操作.还学习了使用BeanUtils来封装数据,并自己实现Beanutils功能.具体如图

360截图20180512231348099.jpg (31.34 KB, 下载次数: 28)

反射

反射
回复 使用道具 举报
任佳锋

JAVA反射机制
是指程序运行过程时,通过字节码对象与方法的配合,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;

三种字节码对象的获取方式
通过类名直接获取字节码对象   譬如Student.class
创建对象 ,通过对象调用getclass方法获取
通过Class类直接调用forname方法传入全类名参数获取

反射获取构造方法的两种方式
通过字节码对象调用 getconstrucotor 方法在括号内传入参数类型.class获取有参构造方法
                Constructor con = clazz.getConstructor(String.class, int.class);
再通过newInstance创建对象并传入参数;
                Object obj = con.newInstance("老陈", 47);
获取空参构造方法
                Constructor cstr = clazz.getConstructor();
通过newInstance创建对象;
                Object ni = cstr.newInstance();

其次   反射获取成员变量(字段)与成员方法的方法大致分为两种:
  一种是获取public修饰的也就是公共的成员变量(字段)与方法:
Field[] getFields() 获取所有公共的成员变量(字段)  返回对象数组
Field getField(String name) 获取指定的成员变量(字段) 返回成员变量(字段)的对象
获取public成员方法:
Method getMethod(String name,(方法名) Class<?>... parameterTypes(当方法需要传入参数时此处填写传入参数的类型.class))  
Object invoke(Object obj, Object... args)  获取之后通过此方法执行获取的成员方法
二种是获取私有的成员变量(字段)与方法:
Field[] getDeclaredFields()   获取所有的成员变量 包含私有
Field getDeclaredField(String name)   获取指定的成员变量 包含私有
注意,此时只是获取,若是需要为成员变量赋值或修改其值这需要调用setAccessible(true)方法躲过jvm的检测,暴力访问
Method m = clazz.getDeclaredMethod("setName", String.class)  获取私有成员方法
若需要执行该方法时,则需要同上调用setAccessible(true)方可执行程序;

BeanUtils 感觉跟平常的类差不多= =同样是用来封装数据的
主要有三种方法
static void        setProperty(Object bean, String name, Object value)   给JavaBean对象的成员变量进行赋值
static String getProperty(Object bean, String name)   获取JavaBean对象的成员变量的值
static void        populate(Object bean, Map properties)    给JavaBean对象的成员变量进行赋值

说实在的, 学了写了这么多.能记住一半我都很高兴了
憋了一个晚上才做了两道作业题,还不是很理解熟练.
有够打击的,
培优班见吧...
回复 使用道具 举报
侯玉林

今天我们学习了反射
1.什么是反射?
所谓反射就是在程序运行时,不需要new对象就能够获取该类的构造方法及其成员的一种机制.
2.我们为什么需要反射,或者说反射存在的意义是什么?
在程序后期更新开发中,由于市场更新需要,所以程序需要添加新的功能模块,但在原有代码上更新或者修改代码是灾难性的事件,在程序中各种类的关系错综复杂,牵一发而动全身,这种事别说是新程序员就是老程序员也犯怵.所以为了提高程序后期的可维护性和可扩展性,Sun公司提供了一套完整的反射机制,通过反射机制你无需去声明一个类,就可以使用其中的功能.
3.反射实现的原理是什么?
        (1)当程序运行时,虚拟机先将xxx.class文件加载到方法区中.
        (2)此时虚拟机中会有一个类的加载器,将方法区中的xxx.class文件生成一个xxx.class文件对象,俗称字节码对象.(对象类型:Class,位于java.lang包下.)
        扩展:由于xxx.class文件只有有一个且只加载一次,所以其生成的字节码对象也只有一个,因此无论你new都是个对象,所有对象的字节码都相同.
        (3)反射能够将xxx.class文件对象解剖,进而获取内部的工作方法和成员,这就是所谓的暴力反射.
4.反射的使用流程
反射的正常使用流程是,先用getxxx方法获取xxx.class文件对象中的构造方法和成员,然后在使用.

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