实现反射首先需要获得该类的Class对象。Java提供三种方式去获取一个类对应的Class对象,说明如下。
1.通过Object类中的getClass()方法
通过对象的getClass方法进行获取,这种方式需要具体的类和该类的对象,以及调用getClass方法。
在Java中,通过一个对象的getClass方法可以获得该对象对应的Class对象。这种方式的前提是该类的实例对象存在。
2.使用.class语法
任何数据类型(包括基本数据类型和引用数据类型)都具备一个静态的属性class,通过它可直接获取到该类型对应的Class对象。这种方式使用到具体的类,调用其属性获取。
3.调用Class类的for Name静态方法
(1)public static Class<?>for Name(String className)throws ClassNotFoundException:返回与带有给定字符串名的类或接口相关联的Class对象。
这种方式根据给出所需类的完全限定名就可以获取该类的Class对象,是最常用的方式。
(2)public static Class<?>for Name(String name,boolean initialize,Class Loader loader)throws ClassNot FoundException:使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的Class对象。给定一个类或接口的完全限定名,此方法会试图定位、加载和链接该类或接口。指定的类加载器用于加载该类或接口。如果参数loader为null,则该类通过引导类加载器加载。只有initialize参数为true且以前未被初始化时,才初始化该类。
该方法不能用于获得表示基本类型或void的任何Class对象。在一个实例方法中,表达式Class.for Name("Foo")等效于Class.for Name("Foo",true,this.getClass().getClassLoader())。
【例12-1】
演示获取Class类对象的三种方式。
创建一个Java项目,项目名为chapter12,在该项目下src目录下创建一个包cn.linaw.chapter12.demo01,在包里创建一个Bank Account类,与项目11相比,为了演示需要,增加了一条打印语句,如图12-1所示。(www.xing528.com)
图12-1 Bank Account类
在cn.linaw.chapter12.demo01包下创建一个GetClass Test测试类,演示获取Bank Account类的Class对象的三种方式,如图12-2所示。
图12-2 获取Bank Account类的Class对象
(1)程序第4、5行是新建一个对象,然后该对象调用继承自Object的getClass()方法获得该类的Class对象。java.lang.Class<T>类是一个泛型类,Class<?>表示该Class引用变量可以指向任意Class对象。
(2)程序第6行利用类的class属性得到该类的Class对象。
(3)程序第10行利用Class类的for Name(String class Name)静态方法获取所需类的Class对象,for Name方法的string Name参数值还可以放置在配置文件中,运行时灵活指定要加载的类。
string Name参数值不要写错,这里提供一种方式。如图12-3所示,在Bank Account类上点击鼠标右键,选择【Copy Qualified Name】选项,就能得到该类完整的类名,粘贴即可。
图12-3 复制Bank Account类的完全限定名(包名+类名)
(4)程序第14、15行显示这三种方式获得的都是同一个Class对象。Class类没有公共构造方法,系统针对每个类只会自动创建一个Class对象。
(5)程序第16行,Class类public String get Name()方法以String的形式返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。