黑马程序员——反射

来源:互联网 发布:ubuntu安装下载语言包 编辑:程序博客网 时间:2024/06/13 16:24

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------



反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。

1、所有的类文件都有共同属性,所以可以向上抽取,把这些共性内容封装成一个类,这个类就叫Class(描述字节码文件的对象)。
Class类中就包含属性有field(字段)、method(方法)、construction(构造函数)。


2、Class和class的区别
1)class:Java中的类,用于描述一类事物的属性和方法。
2)Class:Class是Java程序中各个Java类的总称;它是反射的基石,通过Class类来使用反射。


3、获取Class对象的三种方式
加载XX.class文件进内存时就被封装成了对象,该对象就是字节码文件对象。如何获取Class对象呢?


方式一:
通过对象的getClass方法进行获取。
如:Class clazz=new Person().getClass();//Person是一个类名
麻烦之处:每次都需要具体的类和该类的对象,以及调用getClass方法。

package Reflect; /** * 通过一个对象获得完整的包名和类名 * */class Demo{    //other codes...} class hello{    public static void main(String[] args) {        Demo demo=new Demo();        System.out.println(demo.getClass().getName());    }}


方式二:
任何数据类型都具备着一个静态的属性class,这个属性直接获取到该类型的对应Class对象。
如:Class clazz=Person.class;//Person是一个类名
比第一种较为简单,不用创建对象,不用调用getClass方法,但是还是要使用具体的类,和该类中的一个静态属性class完成。

package Reflect; /** * 通过一个对象获得完整的包名和类名 * */class Demo{    //other codes...} class hello{    public static void main(String[] args) {        Class clazz = Demo.class;        System.out.println(clazz.getName());    }}

方式三:
这种方式较为简单,只要知道类的名称即可。不需要使用该类,也不需要去调用具体的属性和行为。就可以获取到Class对象了。
如:Class clazz=Class.forName("包名.Person");//Person是一个类名
这种方式仅知道类名就可以获取到该类字节码对象的方式,更有利于扩展。

package Reflect; /** * 通过一个对象获得完整的包名和类名 * */class Demo{    //other codes...} class hello{    public static void main(String[] args) {        Class clazz = Class.forName("Reflext.Demo");        System.out.println(clazz.getName());    }}

0 0
原创粉丝点击