JDK1.5的新特性 02

来源:互联网 发布:nagios下载 linux版本 编辑:程序博客网 时间:2024/06/11 13:39

技术摘要:

一,重要的老技术:反射的基础java.lang.Class<T>
二,反射的常用类:
       A,成员变量的反射:java.lang.reflect.Field
       B,构造函数的反射:java.lang.reflect.Constructor<T>
       C,成员函数的反射:java.lang.reflect.Method
       D,数组类型的反射:数组也是一种类型,有自己的class类型(相同的数据类型和维数)
三,反射与可变参数的结合:main方法的反射;如何保证数组参数不被拆包?
四,反射与集合的交汇:ArrayList_HashSet的比较及Hashcode分析    

          

思考:创建对象有多少种方法?
1,导包,new对象;
2,构造方法类的对象建立构造方法对应的对象;
3,字节码对象建立对象;因为每个类都有默认的构造函数,空参数构造函数;而且这个方法只能建立空参数构造函数;
                                    

笔记:
17,反射是1.2的新特性,反射技术,基于Class类,字节码类。
    字节码就是Class类的实例对象,而对象的建立是虚拟机编译成字节码而产生的,所以没有构造函数。
    System.class
    void.class
    new Date().getClass()
    Class.forName("java.lang.String")
 
 18,理解反射的概念  reflect
     需求:把java类的各种成分描述成对应的java类;
     Class类:描述类的属性和方法,类所在的包,类对应的字节码文件,等等
     Field类:描述成员变量的属性和方法
     Constructor类:描述构造方法的属性和方法
     Method类:描述方法的属性和方法
    
     Array类:
    
 19,构造方法的反射应用
    Constructor类:有关构造函数的描述
    需求:如何获取字节码里边的构造函数?给你一个字节码文件。
    在字节码(.class)中获取构造方法(getConstructor())
   
    给你一个构造方法,你能做什么?
    如何建立对象?给你一个构造方法。newInstance()
   
    反射的缺点是什么?对返回来的Consttuctor进行缓存,消化内存,阻碍性能!
   
20,成员变量的反射
    Field类:有关成员变量的描述
    如何获取某个对象的一个变量的值?
    建立对象,获取字节码,获取类字段,从某个对象里获取该字段的值!
    ReflectPoint pt1 = new ReflectPoint(3,5);
    pt1.getInstructor().getFiel("y").get(pt2);
   
    当变量被私有化时,要想访问对象的该变量,需要实施暴力反射:
    fieldX.setAccessible(ture);//可进入的;是否允许访问?
   
    reflect vt. 反映;反射,照出;反省
    需求:想对数据进行操作,查询和修改
   
          想获得对象对应的字节码文件 Class
          想获得对象对应的成员变量 Field     可以修改类的变量值
          想获得对象对应的成员方法 Method
         
                          方法参数 arguments
21,成员变量的反射的综合案例
    需求:变量值修改,如何把String类型变量的值中的b字母,变成a字母?
    分析:要修改变量,必须获取变量的值,要获取变量的值,得先获取变量,要获取变量,先获取字节码文件。
         
22,成员方法的反射
    需求:已知一个对象,以及对象的成员方法的参数,如何调用对于的成员方法?
          想获得对象对应的成员方法 Method类
          Method类有一个方法,可以调用已知类的对于参数的方法:
          方法名.invoke(类对象,方法参数);
          JDK1.5: public Object invoke(Object obj,Object... args)
          JDK1.5: public Object invoke(Object obj,Object[] args)


23,对接收数组参数的成员方法进行反射
    需求:给类名给你,写一个程序去调用该类的main方法;
          主函数是以数组为参数的特殊函数 main(String[] args)
         
          JDK1.4  没有可变参数,会把参数封装到Objec[]数组中进行传递,传递后会被“解包”成多个参数
          而主函数的参数是String[],如何避免被解包?
          1,强调,把数组转成Object类型,对象是不会被解包的;
          2,加包,给字符串在加一层字符串包装,拆了一层,还有一层;
            mainMethod.invoke(null,(Object) new String[] {"a","b","c"})
            mainMethod.invoke(null,new Object[]{new String[] {"a","b","c"}})
24,数组与Object的关系及其反射的类型
    数组的反射:基本数据类型的一维数组都当Object类型来反射;
    实质:数组不是一个类,二是一个对象,因为是通过new出来的;
    需求:想获取数组对象的字节码文件;Object[] a1 = {1,3,4}   a1.getClass()

25,数组的反射应用
    需求:如何获取某个数组对象的数组类型?
    已知一个数组对象 arr,如何知道其数据类型?
    Class类一个方法可以得到字节码文件的数组类型或类的名称:.getName()
    而要得到字节码文件,需要Class对象.getClass()
   
    通过Object设定数组: Object[] arr = new Object[]{"a",1}
    通过元素获取元素类型:arr[0].getClass().getName()
         
26, ArrayList 与 HashSet的比较及hashcode分析
    需求:有序性与唯一性
    hashCode()  哈希码,哈希码可以自定义;
    hashCode() 与 HashSet
    自定义hashCode(),哈希码算法不同,区域存储,区域查询,类似区域定位;提高效率。
   
    注意:
    面试题:1,hashCode()的作用?,提高了唯一性
            2,java有没有可能内存泄漏?有,Hash集合有可能发生内存泄漏!
               原因:当参与哈希值计算的变量被修改后,对象会被存储到其他区域,导致找不到对象,无法删除,
               日积月累,内存泄漏;


原创粉丝点击