获取Class对象的四种方式
反射可以动态获取类的信息,这需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了四种方式获取 Class 对象:
- 知道具体类的情况下可以使用:
Class alunbarClass = TargetObject.class;
但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化
- 通过 Class.forName()传入类的全路径获取:
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
- 通过对象实例instance.getClass()获取:
TargetObject o = new TargetObject();
Class alunbarClass2 = o.getClass();
- 通过类加载器xxxClassLoader.loadClass()传入类路径获取:
Class clazz = ClassLoader.loadClass("cn.javaguide.TargetObject");
通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行
示例
class Student{
private Integer sid;
private String sname;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + "]";
}
}
public class Test {
public static void main(String[] args){
//获取 Class 对象的四种方式
System.out.println("方式一:" + Student.class);
try {
System.out.println("方式二:" + Class.forName("Student"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Student s1 = new Student();
System.out.println("方式三:" + s1.getClass());
try {
System.out.println("方式四:"+ClassLoader.getSystemClassLoader().loadClass("Student"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//使用反射操作Student类的方法以及参数
Student s2 = s1.getClass().newInstance();
s2.setSname("zhangsan");
s2.setSid(1);
System.out.println(s2);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}