title: 反射
反射
- 是一个非常重要的底层技术,经常应用于框架底层和工具底层
- 反射可以通过类对象,获取并操作一个类的所有信息
类对象
-
类的对象:根据类创建出来的实例对象
-
类对象(Class):类加载的产物,里面放着一个类所有的信息(属性,方法,构造方法,父类,接口)
- 类加载:JVM第一次使用一个类的时候,会通过ClassPath找到此类的.class文件,并读取.class文件,将此类的信息加载到JVM中,并保存起来(在方法区中),生成一个类对象
- 八种数据类型也是具有类对象的(获取方式:类型.class;例如:int.class)
-
获取类对象的三种方式
-
通过 类名.class获取类对象
Class c1 = ArrayList.class
-
通过 类的对象.getClass()获取对象
ArrayList list = new ArrayList(); Class c2 = list.getClass();
-
通过Class.forName(“类的全限定名”)
Class c3 = Class.forName("java.util.ArrayList");
-
利用反射获取类信息
-
类对象 Class
-
getName() 获取类的权限定名
-
getPackage() 获取包名
-
getSuperClass() 获取父类类对象
-
getInterfaces() 获取本类直接实现的接口
-
属性对象 Field
-
Field getField(String name) 指定获取本类及父类中可继承到的某一个公开属性,name代表属性名
-
Field getDeclaredField(String name) 指定获取本类中的某一个属性,name代表属性名
-
Field[] getFields() 获取本类及父类中所有的公开属性
-
Field[] getDeclaredFields() 获取本类中的所有属性
-
方法对象 Method
-
Method getMethod(String methodName,Class…) 获取本类及父类可以继承到的某一个公开方法
- 第一个参数:代表想要获取的方法名
- 第二个参数:想要获取到的方法的形参列表的Class对象
- 例如:getMethod(“study”,String.class,int.class,doube.class)
-
Method getDeclaredMethod(String methodName,Class…) 获取本类中的某一个方法,参数含义同上
-
Method[] getMethods() 获取本类及父类可以继承到的所有公开方法
-
Method[] getDeclaredMethods() 获取本类中的所有方法
-
构造方法对象 Constructor
-
Constructor getConstructor(Class…) 获取本类中的某一个公开构造方法,参数代表构造方法的形参类表的类对象
- 例如:getConstructor(String.class,int.class);
-
Constructor getDeclaredConstructor(Class…) 获取本类中的某一个构造方法,参数代表构造方法的形参类表的类对象
-
Constructor[] getConstructors() 获取本类中的所有公开构造方法
-
Constructor[] getDeclaredConstructors() 获取本类中的所有公开构造方法
public class Test02 {
public static void main(String[] args) throws Exception {
//利用反射破坏封装
//获得类对象
Class<Student> c1 = Student.class;
//用私有的构造方法创建类的对象
Constructor<Student> cc = c1.getDeclaredConstructor();
cc.setAccessible(true);
Student s1 = (Student)cc.newInstance();
//调用私有的方法
Method[] mm = c1.getDeclaredMethods();
for(Method m : mm) {
m.setAccessible(true);
m.invoke(s1);
}
//获得本类中的所有属性
Field[] f1 = c1.getDeclaredFields();
for(Field ff : f1) {
ff.setAccessible(true);
System.out.println(ff);
}
}
}
class Student{
private String name;
private int age;
private Student() {}
private void run() {
System.out.println("success");
}
}