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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lc030405 中级黑马   /  2015-1-27 20:54  /  618 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

     说到反射无非是根据名称映射到相应的类,而Java中的反射主要涉及的是把类本身,构造方法,成员变量,成员方法映射成相应的类,分别对应Class,Constructor,Field,Method。
     关于类的映射则是为了通过类型就能实现类的相关功能,如创建实例等。得到某个类的字节码文件对象的方法有三种:1、对象名.getClass();2、Class.forName(“类名”),该方式最为常用,在框架的配置文件中最为常见,该方法有两种形式:查询和加载。3、类名.class。由此我们发现类类只用于描述一类事物的共性,即有哪些属性特征,额不管这些特征赋值如何。关于类这方面有一些而常用的注意事项:int.class代表的是基础类型的字节码文件,而Integer.class代表的是其包装类的字节码文件,包装类通过.TYPE这个常量获取其基础数据类型的字节码文件对象,数组,void均属于一个对象,因此均含有其字节码文件,我们可以通过is.Array来判断是否为数组
     我们也可以通过类的字节码文件获得该类的构造方法,并且通过构造方法来生成一个实例。类型.class.getConstructors()可以获得所有的构造函数,类型.class.getConstructors(参数列表)可以获得特定的参数列表的构造函数对象,参数也是以数据类型的字节码文件对象来表现的。例如:
    Constructor<String> constructor1 = String.class.getConstructor(StringBuffer.class);
    //这个StringBuffer是选择哪个构造方法
    //两次出现StringBuffer,分别对应运行时和编译时运用泛型则不必强制类型转换
   //我们可以用Class.newInstance获取其无参的默认的构造函数的实例。
   String str2 = constructor1.newInstance(/*"abc"*/new StringBuffer("abc"));
   //这个StringBuffer代表  在常见实例时传入一个StringBuffer
      接下来我们谈谈类中成员变量的反射。我们用字节码对象的.getField来获取某个类的成员变量对象,是类的一个属性,而并不是一个值。如果该成员变量的访问修饰符是public,那个获取某个对象的对应的成变量时用.get(对象名)方法就行。当被Private修饰时,则该属性变量对外不可见。为了获取访问的权限用.setAccessible(true);实现。通过反射改变某个对象中特定类型的字段的值,对成员变量进行操作时,我们用.set(obj, newValue)方法即可实现;
     在判断成员变量的类型时,用.getType()获取类型后,在用“==”比较更为专业,因为该字节码文件是唯一的。
     当想反射方法时,为了获取方法,我们使用字节码文件.getMethod("charAt", int.class)方法,//两个参数,前一个是调用方法的名字,后一个是参数的字节码类型列表,invoke()方法的第一个参数是对象实例,第二个是参数,invoke()是方法对象上的方法,如果第一个参数不是对象实例,而是null,则说明说明调用的是一个静态方法(Method是一个静态方法)。当方法中接收的是一个一个字符串数组类型的参数,由于jdk1.5为了兼容老版本把数组又当成多个参数,(JDK1.4把数组当成多个参数)为了使其不将数组当成多个参数,因此在这里需将其强制转换成一个参数。
      还有一个于反射相关的内容,那就是数组。数组的字节码对象随着位数和类型的不同而不同,数组的字节码文件对象的名字是:【I,即前面一个中括号后面一个数据编码对应类的首字母,//数组字节码文件对象的父类是java.lang.Object。基本数据类型不是Object类型,String和数组是Object。用System.out.println()直接打印数组时,不会打印元素,只会打印其字节码文件,一般借助Array的asList()方法。asList方法将数组转换成ArrayList,该方法接收的是一个Object数组,String等对象是Object,字符串数组则按Object数组处理,int不是Object,则整个int数组按一个Object处理,由于整个数组是一个Object,因此把整个数组当成一个元素存入list。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马