Class类是Java程序中Java类的类型
如何获得字节码:3种途径
Class c = xxx.class
Class c = new xxx().getClass()
Class c = Class.forName("xxx")
前两种必须在jvm中已经加载过该类的情况下,第三种在没有加载类的情况下会用类加载器将类加载进jvm的缓存中再读取字节码
基本类型除非转为对象否则无法读取字节码
例:
Class c = 'a'.getClass()
---->报错
Class c = new Character('a')
---->正常
反射就是把java类中的各种成分(变量、方法、构造方法)映射成相应的类
Constuctor类
Constuctor类是构造方法的类型
获得类所有的构造方法
getConstructors()
,返回一个有Constuctor类组成的数组。
获得指定的构造方法
getConstructor(xxx.class)
,返回一个Constuctor类
其中xxx.class是参数类型的字节码
通过Construct的newInstance可以new一个对象
Class也可以newInstance不过是通过Constructor的newInstance并把它缓存起来
String.class.getConstructor(StringBuffer.class).newInstance(new StringBuffer("a"))
<==>
new String("a");
Field类
Filed类是变量的类
getFields()
方法获得所有公有变量,返回一个变量组成的数组
getField(variable name)
通过变量名称,获得类上指定的变量
Filed是类上的变量的对象,需要取得指定类的实例的值(Field.get(Instance))
一般的
getFields()
方法无法访问私有变量,getDeclaredField获得私有变量类型
获得私有变量的值必须先设置
field.setAccessible(true)
改变变量的值用
field.get(variable name)
反射私有变量称为暴力反射
Method类
Method类是方法的类
获得类的方法用方法
getMethod(method name,xxx.class)
method name是方法名称,xxx.class是需要反射的类
调用方法使用方法
invoke(instance,aguments)
因为方法调用必须再对象上使用,所以需要传入类的实例instance。aguments是需要传给方法的参数
调用静态方法时,instance=null即可;
数组的反射
!具有相同维度和元素类型的数组的字节码相等
Array.aslist接受的是Obect[]数组,因为int不是Object所以无法正常打印
HashCode
collection是顺序数组
hashset每次存放都会通过检查hashcode判断对象是否已存在
采用哈希算法的集合,例如hashset,根据存放对象的hashcode值,分区存储。
将对象存放进哈希集合以后,最好不要修改对象内参与哈希计算的变量,否侧容易产生内存泄漏