Java之反射及1.5新特性

一、Class类

        Class类是反射的基石,Java程序中的个个Java类属于同一类事物,通过Java面向对象的思想,对这类事物进行封装描述,类名为Class,对应的是各个类在内存中的字节码文件,每个类的字节码文件就是Class类的一个实例对象,获取Class实例对象的方法有三种,一种是类名.class,一种是类的实例对象.getClass(),最后一种是Class.getByName(),参数为类名,它的获取方式有两种,如果类的字节码文件已经加载进内存,那么可以直接获取,如果类的字节码文件没有加载进内存,则用类加载器进行加载,缓存到JVM内存中,用到时自行调用。

       在源程序中的出现的类型都有各自的Class对象,九种预定义的Class是实例对象为八种基本数据类型的Class对象和void的Class实例对象。

二、反射

        反射就是把Java类中各种成分映射成对应的Java类,一个类中的成员都可以用相应的API类的实例对象表示,包括Constructor、Field、Method等。

      (1)Constructor:Constructor是表示构造函数的类,通过getConstructors方法可以获取包含某一类所有构造方法的数组,向getConstructor方法中传入参数的class实例对象的方法获取指定参数的构造函数,在得到构造函数后在通过newInstance方法创建对象,为了提高效率,在Class类中定义了newInstance方法用于通过空参数构造函数创建对象,该方法内部会先获得空参数的构造函数。newInstance方法调用时,需要进行强转以告诉编译器创建的对象的类型,否则编译失败,编译器是以变量定义为依据,并不执行代码。

      (2)Field:Field是表示成员变量的类,同样获得该类的方法也有两种,一种是getFields方法获取包括所有成员的数组,一种是向getField方法中传入要获取的变量,从而得到该变量,要注意的是通过该方法获取的变量是类中的变量,并没有具体的值,如果要获得某个对象的该变量的对应值,可通过get方法获得,而当类中的成员变量是私有的时候,我们就需要用到暴力反射,用getDeclaredField方法获得类中的变量,setAccessible方法使对象中该私有变量对应的值可见,就可以通过get方法获取到对象中该私有变量的值了。

      (3)Method:Method是表示成员方法的类,通过getMethod方法,传入要获取的方法名称和方法的参数类型的字节码对象获取对应的方法,并通过invoke方法调用,在调用时也需要传入对象和参数,如果参数为null,证明该方法为静态方法。

      (4)对于数组,数组作为一个对象,同样继承自Object类,当两个数组的维数和类型都相同时,数组的字节码文件对象是同一个。

      (5)反射的作用是实现框架的功能。在实际开发中,一个工程会分为几个部分,往往我们在写功能时会用到别人程序中的内容,但我们不知道它定义的类的名字,这时就需要用到反射。

三、1.5新特性

       1、StringBuilder:我们之前使用的StringBuffer是线程同步的,只能有一个线程操作,不同多个线程同时操作,虽然很安全,但效率低,而1.5后出现的StringBuilder是线程不同步的,因为不需要判断锁,所以效率高,在以后的开发中建议使用StringBuilder。

       2、增强for循环:通过for(参数类型  变量名:被遍历集合或数组)这种形式实现对集合或数组元素的取出,该方法的缺陷在于只能获取元素,但不能对集合中的元素进行修改。而传统for和高级for的区别因为高级for有局限性,高级for必须要有被遍历的目标。

       3、静态导入:静态导入可以简化书写,通过静态导入可以将类中的静态方法导入,在调用这些静态方法时可以省略类名,但如果该包中具有相同名称的方法时还是需要指定该方法属于哪一类。

       4、自动装箱与拆箱:根据Java面向对象的思想,我们将基本数据类型也封装成对象,形成基本数据类型封装类,为了提高效率方便书写,我们在对基本数据类型和基本数据类型进行操作时提供了自动装箱和拆箱的功能,比如我们定义一个Integer类型的变量,赋值为6,当对这个变量进行基本运算时,JVM会自动将Integer对象进行拆箱,变为int类型进行操作,并在计算完成后自动将int类型封装成Integer类型。

       5、枚举:枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标,枚举是一个特殊的类,其中的每个元素都是该类的实例对象,且都是静态的。

       6、泛型:泛型是1.5版本以后出现的一个新特性,用于解决安全问题,是一种安全机制,它的好处是能将运行时期出现的问题ClassCastException转移到编译时期,方便于程序员解决问题,让运行问题减少,使程序更安全,同时也避免了强转的麻烦。泛型通过<>来定义要操作的引用数据类型。当类中要操作的引用数据类型不确定的时候,早起通过定义object来完成扩展,现在定义泛型来完成。泛型可以定义在类、方法、接口上,如果定义在类上,则泛型在整个类中有效,泛型类的对象要明确要操作的具体类型,之后所有要操作的类型都固定,而定义在方法上那么只在本方法有效,静态方法不可以访问类上定义的泛型,因为只有类在创建对象后泛型才会确定,静态方法优于对象先存在,所以如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上,泛型同时定义在类和方法上并不冲突,运行时会按照方法上的泛型执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值