黑马程序员-----反射

-------  android培训 java培训 、期待与您交流! ----------

Class.forName(“反射”)

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值,分区存储。

将对象存放进哈希集合以后,最好不要修改对象内参与哈希计算的变量,否侧容易产生内存泄漏




-------   android培训java培训、期待与您交流!  ----------

  详细请查看: http://edu.csdn.net/heima/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值