------- android培训、java培训、期待与您交流! ----------
反射
反射只要知道其类对象就可以获得其内部所有属性对象和方法对象。只要知道其类的实例对象就可以获得其类对象。
Class类。不同于关键字class,他是对java中各个类的封装,是对所有类的抽象描述,而某一个具体的类就是其实例对象。同一个类的实例对象获得的类类型对象是同一个,是由同一个字节码地址类文件实例化出的对象。
类名的获取方法,其实是类类型对象的获取,获取Class的该类实例对象,这个对象!=该类,只是内容为该类还包含该类的字节码地址。类有类,类的成员也有对应的类。类的类中封装了获取类中成员类的对象的方法。如下面的Construct类的对象就是该类中的构造函数,可以通过获取该类的类对象,即内容为该类的类对象,并调用其中的方法或得该类中Construct类的对象,该对象以构造函数为其内容。这里充分体现了面向对象的思想,万物皆对象。
getclass();
Class.forName("");
八种基本数据类型的获取方法,int.class;String.class;void也是一个类对象void.class;这些都是Class类的一个实例对象类
类名的判断
isPrimitive();是否是基本类型;如String.class.isPrimitive()返回false;String不是基本数据类型
与基本数据类型包装类类型比较;如int.class==Interger.TYPE;(后者是类中封装的静态字段)
Class.isArray();判断类时否是一个数组。
总之只要是在源程序中出现的类型,都有各自的Class实例对象。
反射就是把Java类中的各种成分映射成相应的Java类。即将类中的各个成员抽象成相应的Java类。
如Field,Method,Contructor,Package等
Constructor类即构造方法类。
Constructor[] getConstructors();获取所有的构造方法对象,返回的是一个数组。
Constructor getConstructor(param);获取一个构造方法对象,参数就是参数类型类对象
获取构造方法对象之后再通过newInstance(initargs)获得一个新的对象实例,参数为指定初始化参数
如String.class.getConstructor(int.class);
成员变量Field类
int x=5;
Field fieldY=person.getClass().getField("x");这里fieldY的值并不是5;而是x的字节码值。就像是把变量x当做对象,而Field就是他的类,fieldY就是指向变量x对象的引用,x的值是x对象的内容,fieldY的值是对象x的地址,比较时==比较的是地址,equals重写之后比较的是内容,此处fieldY!==x,因为==比较的两端前者是地址值后者是x对象的内容变量x值所以不相等。
根据类名调用另一个程序的main方法
首先获得该类类对象,然后通过getMethod方法或得Method类对象。
Method类对象中的innvoke方法开始调用。
数组的反射
数组也是一种类型,也具有类类Class。与Object类的关系
可以获得数组类Array类,另有一个Arrays工具类其中有对数组对象操作的方法。这样就可以借助反射获得数组类并通过Arrays类直接操作数组,比如遍历不用再写for循环去遍历了。
反射的实用,实现框架功能。即事先不知道要调用的类,写好框架之后通过事先配置好的文件利用反射技术去调用事后添加的类。事后添加的类只需要符合配置文件即可,与事先写好的框架结合。