简介
JAVA提供的一组API,可实现程序在运行期间动态获取某个类、操作某个类
Class类
由SUN指定的一个类,用于描述类的一个类
本质是一个类,自定义的类,就是Class类的实例
Class类就是描述每一个类有哪些属性,方法以及构造方法,通过JAVA提供的反射API操作这些特征
1、Class类的实例(一旦被使用(类加载),就被创建,包含该类的所有信息)由JVM创建
2、Class实例只会被创建一次
类加载
将外部的class文件加载到JVM内存中,同时创建Class类的实例
相关API
获取Class类实例
-
Class.forName(全类名)
-
对象.getClass()
-
类名.Class
// 获取Student类的Class实例
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
// 方式一:Class.forName("全类名")
Class.forName("com.xxx.Test.Student");
// 方式二:类名.class
Student.class;
// 方式三:对象.getClass
new Student().getClass();
}
}
反射方式得到某个类的实例
方法 | 作用 |
---|---|
Class对象.newInstance() | 获取无参构造方法 |
Class对象.getConstructors() | 获取所有构造方法 |
Class对象.getConstructor(Integer.class,String.class) —— c | 获取指定构造方法 |
(Student)c.newInstance(1,"tom") | 调用指定构造方法 |
// 获取Class类实例
Class clazz = Class.forName("com.xxx.Test.Student");
// Class将类的构造方法封装到Constructor的数组
// getConstructor一个类(描述构造方法)
// 获取所有的构造方法
Constructor[] cs = clazz.getConstructors();
// 获取指定参数构造方法
Constructor c = clazz.getConstructor(int.class,String.class);
// 操作构造方法--调用构造方法--创建类的对象
// Object newInstance = clazz.newInstance();
Student student = (Student)c.newInstance(1,"tom");
操作属性
所有类的属性封装在Class类的Fileds属性
一旦某个类的Class对象被创建,该类的所有的属性信息就被封装到Fileds数组
方法名 | 作用 |
---|---|
getField("属性名") | 获取指定的公有属性 |
getFields() | 获取所有的公有属性 |
getDeclaredField("属性名") | 获取指定属性(公有,私有) |
getDeclaredFields() | 获取所有的属性(公有,私有) |
属性对象.set(赋值对象,值) | 属性赋值(私有属性,需要先打破封装 -- 属性对象.setAccessible(true)) |
属性对象.get(获值对象) | 获取指定对象属性值 |
属性对象.getName() | 获取属性名 |
// 获取Class类实例
Class clazz = Class.forName("com.xxx.Test.Student");
// 获取所有属性信息
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 获取每个属性名
System.out.println(field.getName());
}
// 操作(存取值属性) -- 依赖对象
// 创建对象
Object stu = clazz.newInstance();
// 获取name属性(私有)
Field name = clazz.getDeclaredField("name");
// 操作私有属性时需要打破封装性
name.setAccessible(true);
name.set(stu, "tom");
// 获取age属性(公有)
Field age = clazz.getField("age");
// 往age属性赋值(公有)
age.set(stu,1);
操作方法
Method表示普通方法
方法名 | 作用 |
---|---|
getMethod(String name,Class...param) | 获取指定方法(公有) |
getMethods() | 获取所有方法(公有) |
getDeclaredMethod(String name,Class...param) | 获取指定方法(所有) |
getDeclaredMethods() | 获取所有方法(所有) |
public static void main(String[] args) throws Exception {
// 1.获取Student类的Class对象
Class clazz = Class.forName("com.xxx.Test.Student");
Object obj = clazz.newInstance();
// 2.操作方法
Method method = clazz.getDeclaredMethod("sayHello",String.class);
// 获取方法名
System.out.println(method.getName());
// 获取形参数量
System.out.println(method.getParameterCount());
// 3.调用方法
// invoke(某个对象,实参)
// 打破封装特性(私有)
// method.setAccessible(true);
method.invoke(obj,"张三");
}