使用反射操作类成员的前提:
要获得该类字节码文件对象,就是Class对象;
反射的概念:
反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的所有成员(成员变量,成员方法,构造方法),比如知道这类的所有属性和方法并且对于任意一个对象,都能调用它的任意的属性和方法;
如何获取一个类的Class对象
package com.itheima.demo2_Class对象的获取;
public class Student {
private String name;
public void method1(){
}
}
public class Test {
public static void main(String[] args)throws Exception {
// 1.方式一:通过 类名.class 获得
Class<Student> c1 = Student.class;
System.out.println(c1);
// 2.方式二:通过对象名.getClass()方法获得
Student stu = new Student();
Class<? extends Student> c2 = stu.getClass();
System.out.println(c2);
// 3.方式三:通过Class类的静态方法获得: static Class forName("类全名")
Class<?> c3 = Class.forName("com.itheima.demo2_Class对象的获取.Student");
System.out.println(c3);
// 问题:一个类只有一个字节码对象(Class对象)
System.out.println(c1 == c2);// true
System.out.println(c1 == c3);// true
}
}
- 方式1: 通过类名.class获得
- 方式2:通过对象名.getClass()方法获得
- 方式3:通过Class类的静态方法获得: static Class forName(“类全名”)
- 每一个类的Class对象都只有一个。
Class类常用方法
String getSimpleName(); 获得类名字符串:类名
String getName(); 获得类全名:包名+类名
T newInstance() ; 创建Class对象关联类的对象
public class ReflectDemo02 {
public static void main(String[] args) throws Exception {
// 获得Class对象
Class c = Student.class;
// 获得类名字符串:类名
System.out.println(c.getSimpleName());
// 获得类全名:包名+类名
System.out.println(c.getName());
// 创建对象
Student stu = (Student) c.newInstance();
System.out.println(stu);
}
}
反射之操作构造方法
反射之操作构造方法的目的
* 获得Constructor对象来创建类的对象。
Constructor类概述
* 类中的每一个构造方法都是一个Constructor类的对象
例如: (列2种,共4种)
*1. Constructor getDeclaredConstructor(Class... parameterTypes)
* 根据参数类型获得对应的Constructor对象
* 可以是public、protected、(默认)、private修饰符的构造方法。
* 2. Constructor[] getDeclaredConstructors()
*获得类中的所有构造方法对象
*可以是public、protected、(默认)、private修饰符的构造方法。
Constructor<?>[] conArr2 = Class类.getDeclaredConstructors();
反射之操作成员方法
反射之操作成员方法的目的
* 操作Method对象来调用成员方法
Method类概述
* 每一个成员方法都是一个Method类的对象。
例如:(列2种,共4种)
*1. Method getDeclaredMethod(String name,Class...args);
* 根据方法名和参数类型获得对应的成员方法对象,包括public、protected、(默认)、private的
*2.Method[] getDeclaredMethods();
* 获得类中的所有成员方法对象,返回数组,只获得本类的,包括public、protected、(默认)、private的
反射之操作成员变量
```java
反射之操作成员变量的目的
* 通过Field对象给对应的成员变量赋值和取值
Field类概述
* 每一个成员变量都是一个Field类的对象。
例如:(列2种,共4种)
*1. Field getDeclaredField(String name);
* 根据成员变量名获得对应Field对象,包括public、protected、(默认)、private的
*2.Field[] getDeclaredFields();
* 获得所有的成员变量对应的Field对象,包括public、protected、(默认)、private的
暴力反射
调用Constructor对象或Method对象方法:
. void setAccessible(true)
设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消