java反射-java

概念

反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构

实例化对象–>getClass()–>完整的类

反射就是操作Class对象

获取class对象的三种方式

一个加载的类在 JVM 中只会有一个Class实例,通过Class可以完整地得到一个类中的所有被加载的结构

1
2
3
4
5
6
7
8
9
10
11
12
13
import test.Student;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {

Class<?> s1 = Class.forName("test.Student");//通过Class.forName加完整的包名获取

Class<Student> s2 = Student.class;//类名.Class获取

Student student = new Student();
Class<?> s3 = student.getClass();//实例调用自己的getClass方法

}
}

Class对象的作用

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
34
35
36
37
38
39
40
41
42
43
44
45
import test.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

//Class s1 = Class.forName("test.Student");//通过Class.forName加完整的包名获取

Class<Student> s2 = Student.class;//类名.Class获取
//
// Student student = new Student();
// Class<?> s3 = student.getClass();//实例调用自己的getClass方法

//利用Class实例化对象
//s1.newInstance();调用无参构造
Constructor studentConstructor = s2.getConstructor(String.class,char.class,int.class);
Student student1 = (Student) studentConstructor.newInstance("xiu", 'M', 18);
System.out.println(student1);

//获取类里面的属性
//s1.getFields(),获取public的属性

Field[] s1DeclaredFields = s2.getDeclaredFields();
for (Field s1DeclaredField : s1DeclaredFields) {
System.out.println(s1DeclaredField);
}


//查看该Class的所有方法
Method[] s1declaredMethods = s2.getDeclaredMethods();
for (Method s2m : s1declaredMethods) {
System.out.println(s2m);
}
//调用类里面的方法

Method act1 = s2.getDeclaredMethod("action", String.class);
act1.invoke(student1,"xiuxiuxiu");

}
}