1 为什么要获取class对象
当我们要获取类的信息及方法,利用Java中的反射机制,便于我们更加灵活的编写代码,可以在程序运行时装配代码,还可以实现动态代理。
反射机制允许程序在运行期间,获取任何一个已知名称的class内部信息。
那么获取class对象及内容信息的获取,主要有三种方式。
2 使用 getClass() 方法
2.1 创建 Person 类
代码语言:javascript复制package com.clazz;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.2 创建测试类
代码语言:javascript复制package com.clazz;
public class Test {
public static void main(String[] args) {
Person person = new Person();
Class clazz = person.getClass();
System.out.println(clazz.getName());
}
}
输出的结果为该class完整的包路径名及类名:
com.clazz.Person
需要注意的是: 当对同一个类,同时创建多个对象实例时,class对象实际只有一份。
代码语言:javascript复制Person person1 = new Person();
Person person2 = new Person();
System.out.println(person1.getClass() == person2.getClass());
运行的结果为 true。
3 使用 class 静态属性
这种方式不需要对类进行实例化,直接使用类的 class 静态属性即可获取到该类的 class 对象。
代码语言:javascript复制package com.clazz;
public class Test {
public static void main(String[] args) {
Class<Person> personClass = Person.class;
System.out.println(personClass.getName());
}
}
输出的结果为该class完整的包路径名及类名:
com.clazz.Person
4 使用 Class 类中的静态方法 forName()
使用这种方式获取 class 对象,需要在 forName() 方法中指定要获取 Class 对象类的全路径,即包名 类名。
代码语言:javascript复制package com.clazz;
public class Test {
public static void main(String[] args) {
try {
Class<?> aClass = Class.forName("com.clazz.Person");
System.out.println(aClass.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出的结果为该class完整的包路径名及类名:
com.clazz.Person
这里有个问题需要注意,因为是我们手工指定该类的全路径信息,有可能该包未被我们引入,或者是手滑将包名、路径信息输入错误,有可能报错,所以这种方式需要向外抛出异常。