黑马程序员_java基础加强之(反射)

来源:互联网 发布:淘宝买家恶意大量退货 编辑:程序博客网 时间:2024/06/06 03:26

---------------------- android培训、java培训、期待与您交流! ----------------------
一、反射的基石——Class类

获得Class对象的方法:
Person.class:类名.class
new Person.getClass():对象.getClass()
Class.forName("java.lang.String"):Class.forName(完整类名)。

作用:获得类的字节码。有两种情况:如果这个类在内存中,这直接返回;如果内存中没有则通过类加载器加载到虚拟机内存中。以后要得到这个字节码就不用再加载了。在反射中主要使用这种方法,因为在写源程序的时候还不知道类的名字,也就是说我们可以使用一个变量来代替。)

一个字节码可以创建出多个实例对象来。

只要是类型就对应一个Class实例对象。有九个预定义的Class对象:八个基本类型加一个void。

Primitive Data Type:原生数据类型。

int.class.isPrimitive():isPrimitive(原始的)是否是基本数据类型。

Integer.TYPE:代表他所包装的那个基本数据类型的那份字节码,也就是基本数据类型的 Class对象(int.class)

数组不是基本数据类型(Primitive Data Type),是引用类型,判断是否是数组可以使用:isArray();
 
总之,只要是在源程序中出现的类型,都有各自的一份Class实例对象,例如:int[],void,String,int ……

 

二、反射:

java的反射定义:java程序在运行时动态对正在执行的类的自身进行检查,审查。
java的反射能做:通过java的反射我们可以在类的外部得到类中定义的私有方法和属性,并且可以看到类本身的属性、方法、返回值的类型、方法的参数类型、方法返回值的类型、属性的类型。

反射:就是把java类中的各种成分映射成相应的java类。

例如:一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类,表示java类的Class类显然要提供依系列的方法,来获得其中的变量。

通过反射,我们可以得到各个类中相应成分的Class对象。

编译时与运行时的区别:
编译时,检查代码的语法错误。不能检查逻辑错误!
运行时,如果代码存在逻辑错误,那么就会报错。

Constructor:
我们可以通过反射创建对象。

String str = new String("abc");
String str = (String) String.class.getConstructor(StringBuffer.class).newInstance(new StringBuffer("abcde"));

如果通过空参数的构造方法创建一个对象,还可以通过Class.newInstance()方法。

例如:

String str = (String)Class.forName("java.lang.Stirng").newInstance();


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