关于张老师Java视频学习(六)

来源:互联网 发布:dlna软件 编辑:程序博客网 时间:2024/05/16 07:28

http://blog.csdn.net/wizardmly/article/month/2010/12


Java基础知识加强视频的学习:

一、知识点:

21、成员变量反射的综合实例: 将任意一个对象中的所有String类型的成员变量所对应的字符串中的“b”改成“a”。
 (1)、P124:当比较的两个对象的所引用的值,都只有一份值,那么我们可以使用 == 来比较。
 (2)、对字节码使用方法getFields(),得到字节码内所有的字段,用Field类的对象数组返回。
 (3)、对象.getType()   方法返回的是对象所在的类字节码。

22、成员方法的反射:反射到类Method中
 (1)、Method 代表类中的一个方法,与成员变量的反射类似,对应的只是类的字节码中的成员方法的字段
 (2)、如何得到类中的一个方法:
 (3)、调用方法:Method对象.invoke(obj,parameterType list),Method对象执行方法invoke调用,调用Method对象对指的方法,而调用该方法的
  象是obj,调用obj中的哪个重载版本方法,我们用parameterType list 来匹配它。
 (4)、当方法为静态方法时,上述方法invoke参数表中的obj不需要实例对象,可直接改为 null 来调用该方法,因为静态方法不依赖对象存在。

23、对接收数组参数的成员方法进行反射:
 (1)、在Eclipse中,当我们需要一个完整的类名的时候,在程序中选中一个类名,然后按F2,那么将得到完整的类名。
 (2)、//1、 如果直接用语句:mainMethod.invoke(null, new String[]{"111","222","333"});调用main()方法
        // 编译器将报错,因为,在JDK1.5中,为了兼容JDK1.4中的调用方式,编译器将会对数组String[]{...}进行拆包动作
        // 而该数组拆包之后,得到的String[0],String[1],String[2]中的每个元都自动拆包成对应的装箱类型,每一个
        // 元都当做一个数组,数组中的每个元都是一个装箱类型,即有3个数组。

        //2、 用以下方法进行输出时,将String[]{...} 作为 Object[]数组的一个元,那么编译器对数组Object[]拆包的时候,
        // 得到的是String[]{...}
        // mainMethod.invoke(null, new Object[] {new String[]{"111","222","333"}});

        //3、 数组也是一个Object的子类对象,那么当我们用以下输出的时候,将String[]强制转换为一个Object对象,那
        // 么编译器将无法对之进行拆包,传给main()方法的也是整个 String[]{...}数组
          mainMethod.invoke(null, (Object)new String[]{"111","222","333"});
 (3)、在运行一个类的时候,如果类中有main()函数,那么,我们可以像该方法传递一个字符串数组String[] args ,形参名为args。那么,在main()方法
  中,我们可以利用args形参名,来调用传递给我们的字符串数组。特别的,当这个字符串数组,是一个完整类名的时候,我们可以利用该形参来进行
  求得该类的字节码,以便求得该字节码的各种成分。
 (4)、如何给类中main()方法字符串数组参数String[] args,以至于可以在main()方法中直接调用该字符串。
  在Java程序区域 右击 --> Run As -->Run Configuration(运行相关配置) --> 在Argument栏中,填入需要传递的实参,该实参将传递给类mai()方法

24、数组与Object的关系及其反射类型:
 (1)、数组的反射:数组也是一种类型,每一个具有相同的元素类型和维数的数组,都属于同一个Class(字节码),。
 (2)、在返数组对象的字节码名字的时候,得到“[I”  ,其中,中括号“[”表示数组,并且,多少个“[”,表示多少维的数组“I”表示整数。
  可以在类Class的getName()方法中查阅相关知识。
 (3)、得到某个类的超类,我们使用方法:对象名.getClass().getSuperclass().getName().
  我们对数组类型变量使用(3)的方法,我们得到他们的超类都是Object。
 (4)、如何直接打印数组的全部元素:利用类Arrays中的方法asList() :Arrays.asList(“数组名”),那么我们将得到该数组的值列表。
 (5)、Arrays.asList()方法处理int[]和String[]时的差异:

       String[]数组中的String对象都是Object对象,而int[]数组中的int元,只是基本类型,不是一个Object对象。
      传递给asList()的实参,如果是String[]数组,那么,数组中的每个元都是Object对象。如果是int[]数组,数组中的元,都是一个基本 类型,不是Object。在JDK1.4中,传递给asList()方法的实参,是Object[]数组,而在JDK1.5以及以上版本中,利用了可变参数来实现。当我们传递String[]数组给形参时,由于上述String[]的特性,即正确的传递了实参给asList()方法。但是,当我们传递给int[]数组给形参时,由于int[]数组的上述特性,错误的传递了形参,那么,返回JDK1.5以上的版本,使之处理,而在该处理中,实参int[]将当做一个Object对象,即只能返回该对象的数组类型和散列码。

二、问题与收获:
 (1)、JDK1.4没用引入可变参数,是在1.5中引入的,而且JDK1.5中新增了自动装箱功能,
 (2)、当我们按JDK1.4的语法来调用invoke方法时,参数列表使用数组来传递,如Object[] {2}, 但是,为何另数组元数有多个时,如{2,1,0},编译器报错?
 (3)、在看视频的时候,老师定义了几个数组,然后进行比较,在Eclipse中代码不报错,但是,我自己运行的时候,出现了如下错误:
  Incompatible operand types Class<capture#8-of ? extends int[]> and Class<capture#9-of ? extends int[][]>
  解析:查阅了网上的资料,解释如下:
   对于数组类型的变量编译器在编译时,其实已经知道类型了。也就是说,编译器认为这2个类型是不一样的。根本没有比较的需要。
   对于总是不成立的比较,其实是没有意义的。这个编译错误是 JDK 1.6的新功能 
        而老师使用的恰好是JDK1.5的版本,我使用的是1.6版本。


原创粉丝点击