黑马程序员——Java的反射

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

Java提供一套机制来动态的执行java类的方法和构造方法以及成员变量操作的机制被称为反射。还有一位前辈总结了反射的概念,反射就是把Java类中的各种成分映射成相应的java类,一个Java类中用一个Class类的对象来表示,成员变量、方法、构造方法和包分别对应的类的实例对象是Field,Method,Constructor,Package。一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。

Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class。当一个类被加载进内存时,生成类的字节码占用一片内存空间。要得到字节码相对应的实例对象有三种方法:

类名.class:直接使用类名获取;对象.getClass():对象调用getClass方法;Class.forName("类名"):使用Class的forName方法填入类名即可。

其中定义了9种基本数据类型,boolean,byte,char,short,int,long,float,double以及void,比如  int.class==Integer.TYPE;判断一个Class是否是原始数据类型可以使用isPrimitive()方法


Constructor类代表某个类中的构造方法。

Constructor[] cons=Class.forName("java.util.String").getConstructor(StringBuffer.class);使用Constructor[]来接收该类中的全部构造方法,想获得特定的构造方法,就与构造方法的参数类型相关。

String.class.getConstructor(StringBuffer.class)。这样就得到一个String的参数类型为StringBuffer类型的构造函数。然后可以定义一个String对象,要用到上面相同的对象。

String s1=(String)cons.newInstance(new StringBuffer("qwe"));newInstance方法创建对象在执行前是不确定返回值的,所以返回值类型是Object,要显式转换为String类型。


Field类代表某个类中的一个成员变量。

Field f1=对象.getClass().getField("变量名");这时的f1不是对象上的变量,而是类上的,要用它取对象上相应的值,方法是 f1.get(对象);这种方法是没办法取出类中的私有成员变量的,所以另外定义了方法:Field f2=对象.getClass().getDeclaredField("变量名");  f2.setAccessible(true);//设置可以访问 ,之后再用f2.get()方法就可以顺利取出变量值了。


Method类代表某个类中的一个成员方法。

Method m1=String.class.getMethod("charAt",int.class)  使用getMethod方法根据方法名和参数类型获取该类的指定的方法。

正常的方法调用是要用到这个类的对象来调用,String str=“asd”; str.charAt(1);

使用反射的方法调用,要把得到的方法作用于对象,m1.invoke(str,1) 这时要传递的参数是类类型对象和方法的参数。如果传递给invoke方法的第一个参数为null,则说明Method对象对应的是一个静态方法。

用反射的原理执行一个类中的main方法

String cname=args[0];//main方法第一个参数为这个main方法执行的类

Method m1=Class.forName(cname).getMethod("main",String[].class)//获取该类的main方法

m1.invoke(null,new Object[]{new String[]{"111","222"}})//静态方法第一个参数为null,main方法接收的一个String[]数组,将其打包成到一个Object[]中,这样在拆包后的参数为String[]。


数组和Objcet的反射关系,数组的维度和参数相同那么他们的class字节码文件也相同。

int[] a1=new int[3]

int[] a2=new int[6]

int[][] a3=new int[2][2];

a1.getClass()==a2.getClass():为真;a1.getClass()==a3.getClass():为假。代表数组的class实例对象的getSuperclass()方法返回的父类为Object类对应的Class

基本数据类型的一维可以被当做Object类型使用,不能当做为Object[]数组使用,非基本类型的一维数组,既可以作为Object类型使用,也可以作为Object[]数组使用。在知道了反射的各类方法后,张老师讲了用反射实现框架的功能,工具类是为了给用户的类调用的,框架则是为了调用用户提供的类。由于在编写框架时无法知晓要操作的类名所以无法用new创建一个该类实例对象而要用反射来做。


JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。一个符合JavaBean特点的类可以作为一个普通类来操作,但是当做一个JavaBean使用是有好处的也是很必要的


---------------------- android培训java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值