黑马程序员——反射知识总结

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

一.概念:反射就是把java类中的各种成分映射成相应的java类。java类中的成分有Constructor、Field、Method、Package等。

二.成分分析

1.Constructor类(构造方法)

得到某个类所有的构造方法:

Constructor [] constructors = Class.forName("java.lang.String").getConstructors();

得到一个构造方法:

Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//通过参数确定要获得哪个构造方法

创建实例对象:

String str = (String)constructor.newInstance(new StringBuffer("abc"));

注意:在反射中,只有Constructor和类字节码(例如:String.class)才能创建实例对象,区别在于类字节码只能通过调用无参构造函数创建。

2.Field类(成员变量)

得到某个类所有的成员变量:

Field [] fields = obj.getClass().getFields();//obj是个对象

得到一个成员变量并调用

①成员变量是非private

Field fieldX = obj.getClass().getField("x");//obj里面有public成员变量x

fieldX .get(obj);//确定从哪个对象中得到变量值。

②成员变量是private

Field fieldX = obj.getClass().getDeclareField("x");

fieldX.setAccessible(true);//先设置变量对象中的权限

fieldX.get(obj);

3.Method类

得到某个类所有的方法:

Method [] methords = Class.forName("java.lang.String").getMethods();

得到一个方法:

Method methord  = Class.forName("java.lang.String").getMethod("charAt",int.class);//charAt是方面名,int.class是该方法的参数类型字节码

注意:如果第一个参数为null,说明Method对象对应的是一个静态方法!

调用方法:

charAt.invoke(str,1);//str是一个String类型对象。

注意:jdk1.4和jdk1.5的invoke方法区别

jdk1.5: public Object invoke (Ojbect obj , Object... args)

jdk1.4: public Object invoke (Ojbect obj , Object[] args)

根据参数兼容性质,1.5即可以接受数组又可以接收可变多参 。为什么参数即可以接收数组又可以接收可变多参呢?这得益于函数体兼容,因为函数体对传进来的数组做了"打散"处理,让它变成了"多参"。如果你的运行环境是jdk1.5,在反射main()方法时为了兼容1.4需要传数组,但考虑到传入时会被打散所以需要在外层额外包装一层数组 ,才能达到最终给传进去一个数组的目的,或者用(object)强转一下,让JVM不认为它是数组,如下:

method.invoke(null,new Object[]{new String[]{"xxx"}});

method.invoke(null,(Object)new String[]{"xxx"});

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值