引入泛型的目的
通过泛型使得在编译阶段完成一些类型转换的工作,避免在运行时强制类型转换而出现ClassCastException,即类型转换异常。
优点
在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。
Java反射机制定义
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
1.通过完整包名和类名获取类的Class对象clazz;
2.通过Class对象clazz获取它的构造函数,属性和方法所对应的Constructor对象,Filed对象和Method对象。【getConstructors()、getMethods()、getFields()】
3.通过Class对象clazz生成类的实例对象obj。【newInstance()】
4.反射调用方法。【Method.invoke(Object obj, Object... args)】
Class clazz = Class.forName("com.yolo.Person");
Constructor constructor = clazz.getConstructor(null);
// 获得与该方法对应的Method对象
Method methodSetName = clazz.getDeclaredMethod("setName", String.class);
Method methodGetName = clazz.getDeclaredMethod("getName");
// 获得与该属性对应的Filed对象
Field field = clazz.getDeclaredField("name");
Field fieldAge = clazz.getDeclaredField("age");
// 实例化Person对象
Person p = (Person) clazz.newInstance();
Person p1 = (Person) constructor.newInstance();
// 调用指定的函数并传递参数
methodSetName.invoke(p, "tracelss");
methodGetName.invoke(p);
// 访问成员变量,如果是基础数据类型,则使用setXXX/getXXX形式的方法,否则直接使用set/get
field.set(p, "xin");
fieldAge.setInt(p, 18);
网友评论