java反射-java Class基本使用

java反射-java Class基本使用


通过Class类获取对象完整包类名:

我们新建一个Student类:

1
2
3
4
5
package com.java1234.chap07.sec01;
 
public class Student {
 
}

我们新建一个测试类:

1
2
3
4
5
6
7
8
9
package com.java1234.chap07.sec01;
 
public class Test01 {
 
    public static void main(String[] args) {
        Student student=new Student();
        System.out.println(student.getClass().getName());
    }
}

运行输出:

com.java1234.chap07.sec01.Student


这里对象.getClass() 调用的是Object类的getClass() 得到Class对象 然后再调用Class里的getName()方法,获取到完整包路径类;


通过完整包路径类型来实例化Class对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.java1234.chap07.sec01;
 
public class Test02 {
 
    public static void main(String[] args) {
        try {
            Class<?> c=Class.forName("com.java1234.chap07.sec01.Student");  
            System.out.println(c.getName());
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行输出:

com.java1234.chap07.sec01.Student


通过得到Class对象,我们可以通过Class对象得到com.java1234.chap07.sec01.Student类的完整结构;



通过完整包路径类型来实例化Class对象,再通过Class对象获取Student类实例:

我们先改写下Student类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.java1234.chap07.sec01;
 
public class Student {
 
    private String name;
    private Integer age;
     
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
     
     
}


我们写个测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.java1234.chap07.sec01;
 
public class Test03 {
 
    public static void main(String[] args) {
        Class<?> c=null;
        try {
            c=Class.forName("com.java1234.chap07.sec01.Student");  
            System.out.println(c.getName());
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Student s=null;
        try {
            s=(Student) c.newInstance();
        catch (InstantiationException | IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        s.setName("小锋");
        s.setAge(28);
        System.out.println(s);
    }
}


我们改下上面的Student 加下有参构造方法,这样使得Student类没有默认无参构造方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.java1234.chap07.sec01;
 
public class Student {
 
    private String name;
    private Integer age;
     
     
     
    public Student(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
     
     
}

然后我们再运行上面的测试类:

java反射-java Class基本使用


报错了 找不到默认构造方法;


在这种情况下,我们可以通过Class类来获取Student类里的构造方法,再调用构造方法即可,我们前面说过,可以通过反射获取整个类的结构,

包括 属性 方法 构造方法 等等。


我们给下测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.java1234.chap07.sec01;
 
import java.lang.reflect.Constructor;
 
public class Test04 {
 
    public static void main(String[] args) {
        Class<?> c=null;
        try {
            c=Class.forName("com.java1234.chap07.sec01.Student");  
            System.out.println(c.getName());
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Student s=null;
        Constructor<?>[] cons=c.getConstructors();
        try {
            s=(Student) cons[0].newInstance("小锋",28);
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(s);
    }
}


运行输出:

com.java1234.chap07.sec01.Student

Student [name=小锋, age=28]