概述:
Java的强大之一,就是强大的反射功能,如果能够熟练的使用Java的反射,那你对Java的理解将更深入一层; JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取对象的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
一 、 获取对象的Class 对象:
// 类的全限定名称
Class.forName(String className);
// 这中方式可以指定类的加载器,这种指定类加载器的方式,可以实现对任意位置的字节码文件进行加载和实例化
Class.forName(String name, boolean initialize, ClassLoader loader);
// 最终都会调用这个方法获取字节码生成对应的 Class对象
Class.forNmae(String name, boolean initialize, ClassLoader loader, Class<?> caller);
// 获取类的全限定名称:com.ask.service.imp.reflec.AlertResultDTO
aclass.getCanonicalName()
二 、 通过Class对象获取构造方法
A:获取所有构造方法
public Constructor<?>[] getConstructors() 获取所有的构造方法不包含私有的
public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法 包括私有的
B:获取单个构造方法
public Constructor getConstructor(Class<?>… parameterTypes) 获取单个的构造方法 不包含私有的
public Constructor getDeclaredConstructor(Class<?>… parameterTypes) 获取单个的构造方法包含私有 的
三.通过Class对象获取成员变量
A:获取所有成员变量
public Field[] getFields() 获取所有的成员变量包含从父类继承过来的
public Field[] getDeclaredFields() 获取所有的成员变量 包含私有的
B:获取单个成员变量
public Field getField(String name)// 指定名称获取公共的成员变量包括从父类继承的
public Field getDeclaredField(String name) // 指定名称获取公共(私有)的成员变量
四、通过Class对象获取成员方法
A:获取所有成员方法
public Method[] getMethods() //获取所有的公共的成员方法不包含私有的 包含从父类继承过来的过来的公共方法
public Method[] getDeclaredMethods()//获取自己的所有成员方法 包含私有的
B:获取单个成员方法
//参数1: 方法名称 参数2:方法行参的class 对象
public Method getMethod(String name,Class<?>… parameterTypes) //获取单个的方法 不包含私有的
public Method getDeclaredMethod(String name,Class<?>… parameterTypes) 获取单个方法包括私有的
Method对象:通过Class对象可以获取到当前类的方法,这些方法是被封装在java.lang.reflect.Method中
Method[] methods = alertResultDTOClass.getDeclaredMethods();
// 获取方法对应类的全限定名称
method.getDeclaringClass();
// 获取方法的详细描述(包括修饰符、返回值、路径、名称、参数、抛出值)
// public void com.ask.service.imp.reflec.AlertResultDTO.setCount(java.lang.Integer)
method.toGenericString();
// Modifier 有很多的静态方法可以对method进行判断
int modifiers = method.getModifiers();
System.out.println(Modifier.toString(modifiers));
// 获取方法的入参类型
Class<?>[] parameterTypes = method.getParameterTypes();
// 获取方法的返回类型
Class<?> returnType = method.getReturnType();
// 获取方法上的注解
Annotation[] annotations = method.getAnnotations();
方法有三种类型:synthetic, varagrs, bridge。
synthetic:合成方法
Synthetic (合成)方法是由编译器产生的、源代码中没有的方法。
当内部类与外部类之前有互相访问 private 属性、方法时,编译器会在运行时为调用方创建一个 synthetic 方法。
varagrs:可变参数方法
bridge: 桥接方法
桥接方法是为了泛型的向前兼容提出的
具体解释请移步:https://shixin.blog.csdn.net/article/details/54604224
参考资料:
https://www.programcreek.com/java-api-examples/index.php
https://www.cnblogs.com/boothsun/p/11146827.html
https://blog.csdn.net/ZXD693/article/details/90756791
https://shixin.blog.csdn.net/article/details/54604224