victory的博客

长安一片月,万户捣衣声

0%

Java | 获取Class对象的四种方式

获取Class对象的四种方式

反射可以动态获取类的信息,这需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。Java 提供了四种方式获取 Class 对象:

  1. 知道具体类的情况下可以使用:
Class alunbarClass = TargetObject.class;

但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化

  1. 通过 Class.forName()传入类的全路径获取:
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
  1. 通过对象实例instance.getClass()获取:
TargetObject o = new TargetObject();
Class alunbarClass2 = o.getClass();
  1. 通过类加载器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();
        }
        
        
    }
}