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集合有可能发生内存泄漏!
原因:当参与哈希值计算的变量被修改后,对象会被存储到其他区域,导致找不到对象,无法删除,
日积月累,内存泄漏;
- JDK1.5的新特性 02
- JDK1.5-JDK1.8的新特性
- jdk1.5的新特性
- JDK1.5的新特性
- JDK1.5的新特性
- JDK1.5的新特性
- JDK1.5的新特性
- jdk1.5的新特性
- JDK1.5的新特性
- JDK1.5的新特性
- JDK1.5的新特性
- jdk1.5的新特性
- jdk1.5的新特性
- jdk1.5的新特性
- JDK1.5的新特性
- JDK1.5的新特性
- JDK1.5,JDK1.6,JDK1.7 各自的新特性
- JDK1.5 新特性
- 程序猿咆哮体--纯娱乐,勿认真
- Android开发入门_环境搭建
- JDK1.5的新特性 01
- 一个有坏道U盘的拯救过程
- 申请了个Sourceforge项目
- JDK1.5的新特性 02
- Handler
- 二元查找树的后序遍历结果[数据结构]
- xwiki是什么?能做什么?
- solr faceted search
- 设计模式之静态代理
- 快速和选择排序程序示例
- ZOJ Monthly, August 2012
- 翻转句子中单词的顺序[算法]