黑马程序员——Java的反射,黑马程序员java
黑马程序员——Java的反射,黑马程序员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使用是有好处的也是很必要的
相关文章
- 暂无相关文章
用户点评