概念
指的是可以于运行时加载,探知和使用编译期间完全未知的类。
Class类与java.lang.reflect类库一起对反射进行了支持,该类库包含Field、Method和Constructor类,这些类的对象由JVM在启动时创建,用以表示未知类里对应的成员。
获取一个Class
- Class.forName(“ren.liushuang.test.reflect.User”)
- user.getClass();
- User.class
Field属性
类的属性,可以通过userClass.getFields()获得Field[]
* getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.
* getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
* 通过设置age.setAccessible(true);可以改变private的对象的属性
Class<?> classUser = Class.forName("ren.liushuang.test.reflect.User");
User user1 = (User)classUser.newInstance();
Field age = classUser.getDeclaredField("age");
age.setAccessible(true);
age.set(user1,18);
Method方法
获取类对应的方法,相同方法名不同参数类型的是不同的方法。
通过invoke进行调用,需要传入对应的参数。
Method setAge = classUser.getDeclaredMethod("setAge", Integer.class);
setAge.invoke(user1, 19);
创建一个java对象的方法
- new
- 反射
- 反序列化
- clone