首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Java核心技术点之反射(2)

Java核心技术点之反射(2)

(1) 通过类名获取Class对象:
    若在编译期知道一个类的名字,我们可以这样获取它的Class对象:
1 Class<People> peopleClass = People.class;

    还有一种根据类的完整路径名获取Class对象的方法如下所示:
1 Class<People> peopleClass = Class.forName("com.test.People"); //假设People类在com.test包中
    注意,Class.forName()方法的参数必须是一个类的全路径名。实际上,只要我们“import com.test.People",就可以直接通过”People.class"获取他的Class对象,而不用写出全路径这么麻烦。
  (若在调用 Class.forName()方法时,没有在classpath找到对应的类,会抛出 ClassNotFoundException。)

(2) 通过对象本身获取其Class对象:
1 People people = new People("Bill", 18);2 Class<People> peopleClass = people.getClass();
3. 通过反射获取类的构造器      一旦我们获得了People的Class 对象,我们便可以通过这个Class 对象获取到People类的原始定义信息。 首先,我们来获取People类的构造器对象,有了这个构造器对象,我们便能够构造出一个People对象出来。比如,我们可以在Student.java中添加以下代码:
[url=][/url]
[url=][/url]
1 public static void main(String[] args) { 2         Class<People> pClass = People.class; 3         System.out.println(pClass); 4         try { 5             Constructor<People> constructor = pClass.getConstructor(String.class, int.class); 6             People people = constructor.newInstance("Bill", 18); 7             obj.speak(); 8         } catch (Exception e) { 9             e.printStackTrace();10         }11 }[url=][/url]
[url=][/url]

  在第4行,我们调用getConstructor方法来获取一个People类的构造器对象,由于我们想要获取的构造器的形参类型为String和int,所以我们传入String.class和int.class。有了构造器对象,我们便可以调用newInstance方法来创建一个people对象,如上面代码的第6行所示。
   注意,当通过反射获取到类的 Constructor、Method、Field对象后,在调用这些对象的方法之前,先将此对象的 accessible 标志设置为 true,以取消 Java 语言访问检查,可以提升反射速度。如以下代码所示:
1 Constructor<People> constructor = peopleClass.getConstructor(String.class, int.class);2 // 设置 constructor 的 Accessible属性为ture以取消Java的访问检查3 constructor.setAccessible(true);
返回列表