1、概述
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
2、获取Class类对象的三种方式
- 类名.class属性
- 对象名.getClass()方法
-
Class.forName(全类名)方法
//1.Class类中的静态方法forName("全类名")
//全类名:包名 + 类名
Class clazz = Class.forName("com.Student");
System.out.println(clazz);
//2.通过class属性来获取
Class clazz2 = Student.class;
System.out.println(clazz2);
//3.利用对象的getClass方法来获取class对象
//getClass方法是定义在Object类中.
Student s = new Student();
Class clazz3 = s.getClass();
System.out.println(clazz3);
3反射获取构造方法
方法名 |
说明 |
Constructor<?>[] getConstructors() |
返回所有公共构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() |
返回所有构造方法对象的数组 |
Constructor<T> getConstructor(Class<?>... parameterTypes) |
返回单个公共构造方法对象 |
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) |
返回单个构造方法对象 |
Class clazz = Student.class;
System.out.print("返回所有构造方法对象的数组:\n");
Constructor[] constructors1 = clazz.getConstructors();
for (Constructor constructor : constructors1) {
System.out.println(constructor);
}
System.out.printf("返回所有构造方法对象的数组:\n");
Constructor[] constructors2 = clazz.getDeclaredConstructors();
for (Constructor constructor : constructors2) {
System.out.println(constructor);
}
//小括号中,一定要跟构造方法的形参保持一致.
System.out.printf("返回单个构造方法对象:\n");
Constructor constructor = clazz.getDeclaredConstructor();
System.out.println(constructor);
System.out.printf(" 返回单个公共构造方法对象:\n");
Constructor constructor1 = clazz.getConstructor();
System.out.println(constructor1);
方法名 |
说明 |
T newInstance(Object...initargs) |
根据指定的构造方法创建对象 |
setAccessible(boolean flag) |
设置为true,表示取消访问检查 |
static void test() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//1.获取class对象
Class clazz = Student.class;
//2.获取一个私有化的构造方法.
Constructor constructor = clazz.getDeclaredConstructor(String.class);
//被private修饰的成员,不能直接使用的
//如果用反射强行获取并使用,需要临时取消访问检查
constructor.setAccessible(true);
//3.直接创建对象
Student student = (Student) constructor.newInstance("zhangsan");
System.out.println(student);
}
4反射获取成员变量
方法名 |
说明 |
Field[] getFields() |
返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() |
返回所有成员变量对象的数组 |
Field getField(String name) |
返回单个公共成员变量对象 |
Field getDeclaredField(String name) |
返回单个成员变量对象 |
static void test() throws NoSuchFieldException {
Class clazz = Student.class;
System.out.println("公共成员变量对象的数组:");
Field[] fields1 = clazz.getFields();
for (Field field : fields1) {
System.out.println(field);
}
System.out.println("返回所有成员变量对象的数组:");
Field[] fields2 = clazz.getDeclaredFields();
for (Field field : fields2) {
System.out.println(field);
}
//想要获取的成员变量必须是真实存在的
//且必须是public修饰的.
System.out.println("单个公共成员变量对象:");
Field field1 = clazz.getField("name");
System.out.println(field1);
System.out.println("单个成员变量对象:");
Field field2 = clazz.getDeclaredField("money");
System.out.println(field2);
}
方法名 |
说明 |
void set(Object obj, Object value) |
赋值 |
Object get(Object obj) |
获取值 |
static void test() throws NoSuchFieldException, InstantiationException, IllegalAccessException {
Class clazz = Student.class;
//1先创建一个对象
Student student = (Student) clazz.newInstance();
//2.获取成员变量Field的对象
Field field = clazz.getField("name");
//3有了对象才可以给指定对象进行赋值
field.set(student,"zhangsan");
System.out.println(student);
//1创建一个对象
Student student2 = (Student) clazz.newInstance();
//2.获取成员变量Field的对象
Field field2 = clazz.getDeclaredField("money");
//3.取消一下访问检查
field2.setAccessible(true);
//4获取指定对象的money的值
Object o = field.get(student);
//5.打印一下
System.out.println(o);
}
5、反射获取成员方法并使用【应用】
方法名 |
说明 |
Method[] getMethods() |
返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() |
返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class<?>... parameterTypes) |
返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>... parameterTypes) |
返回单个成员方法对象 |
static void test() throws NoSuchMethodException {
Class clazz = Student.class;
System.out.println("返回所有公共成员方法对象的数组,包括继承的:");
Method[] methods1 = clazz.getMethods();
for (Method method : methods1) {
System.out.println(method);
}
System.out.println("返回所有成员方法对象的数组,不包括继承的:");
Method[] methods2 = clazz.getDeclaredMethods();
for (Method method : methods2) {
System.out.println(method);
}
System.out.println("返回单个公共成员方法对象:");
Method method1 = clazz.getMethod("function1");
System.out.println(method1);
System.out.println("返回单个成员方法对象:");
Method method = clazz.getDeclaredMethod("show");
System.out.println(method);
}
- 运行方法:
Object invoke(Object obj, Object... args)
参数一: 用obj对象调用该方法
参数二: 调用方法的传递的参数(如果没有就不写)
返回值: 方法的返回值(如果没有就不写)
static void test() throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
//1.获取class对象
Class clazz = Student.class;
//2.获取里面的Method对象 function4
Method method = clazz.getMethod("function4", String.class);
//3.运行function4方法就可以了
//3.1创建一个Student对象,当做方法的调用者
Student student = (Student) clazz.newInstance();
//3.2运行方法
Object result = method.invoke(student, "zhangsan");
//4.打印一下返回值
System.out.println(result);
}