反射 p4 反射获取类的结构信息
反射获取类的结构信息
-
关于Class的API
- getName:获取全类名
- getSimpleName:获取简单类名
- getFields:获取所有Public修饰的属性,包含本类及其父类(不仅仅是直接父类)
- getDeclaredFields:获取本类中的所有属性,不包括父类
- getMethods:获取所有public修饰的方法,包含本类及其父类的(不仅仅是直接父类)
- getDeclaredMethods:获取本类中所有方法,不包括父类
- getConstructors:获取所有public修饰的构造器,不包括父类
- getDeclaredConstructors:获取本类中的所有构造器,不包括父类,构造器不能被继承
- getPackage:以Package形式返回包信息
- getSuperClass:以Class形式返回父类信息
- getInterface:以Class[]形式返回接口信息,不包括父类
- getAnnotations:以Annotation[]形式返回注解信息
-
关于Field的API
- getModifiers:以int的形式返回修饰符
规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16 - getType:以Class形式返回属性类型
- getName:获得属性名
- getModifiers:以int的形式返回修饰符
-
关于Method的API
- getModifiers:以int的形式返回修饰符
规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16 - getReturnType:以Class形式返回方法返回值类型
- getName:获得方法名
- getParameterTypes:以Class[]形式返回方法的形参列表
- getModifiers:以int的形式返回修饰符
-
关于Constructor的API
- getModifiers:以int的形式返回修饰符
规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16 - getName:获得构造器名
- getParameterTypes:以Class[]形式返回构造器的形参列表
- getModifiers:以int的形式返回修饰符
-
案例演示
package com.hspedu.reflection; import org.junit.Test; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * @author: 86199 * @date: 2023/6/4 10:42 * @description: 演示如何通过反射获取类的结构信息 */ public class ReflectionUtils { public static void main(String[] args) throws ClassNotFoundException { ReflectionUtils reflectionUtils = new ReflectionUtils(); System.out.println("========================api_01()======================="); reflectionUtils.api_01(); System.out.println("========================api_02()======================="); reflectionUtils.api_02(); } //第一组方法API:java.lang.Class @Test public void api_01() throws ClassNotFoundException { //得到Class对象 Class<?> personCls = Class.forName("com.hspedu.reflection.Person"); //1. getName:获取全类名 System.out.println(personCls.getName());//com.hspedu.reflection.Person //2. getSimpleName:获取简单类名 System.out.println(personCls.getSimpleName());//Person //3. getFields:获取所有Public修饰的属性,包含本类及其父类(不仅仅是直接父类) for (Field field : personCls.getFields()) { System.out.println("本类及父类的公有属性"+ field.getName()); } //4. getDeclaredFields:获取本类中的所有属性,不包括父类 for (Field declaredField : personCls.getDeclaredFields()) { System.out.println("本类中所有属性" + declaredField.getName()); } //5. getMethods:获取所有public修饰的方法,包含本类及其父类的(不仅仅是直接父类) for (Method method : personCls.getMethods()) { System.out.println("本类及其父类的公有方法 = " + method); } //6. getDeclaredMethods:获取本类中所有方法,不包括父类 for (Method declaredMethod : personCls.getDeclaredMethods()) { System.out.println("本类的方法 = " + declaredMethod); } //7. getConstructors:获取所有public修饰的构造器,不包括父类 for (Constructor<?> constructor : personCls.getConstructors()) { System.out.println("本类的public构造器 = " + constructor); } //8. getDeclaredConstructors:获取本类中的所有构造器,不包括父类,构造器不能被继承 for (Constructor<?> declaredConstructor : personCls.getDeclaredConstructors()) { System.out.println("本类的所有构造器 = " + declaredConstructor); } //9. getPackage:以Package形式返回包信息 System.out.println(personCls.getPackage());//package com.hspedu.reflection //10. getSuperClass:以Class形式返回父类信息 System.out.println("父类的class对象 = " + personCls.getSuperclass());//父类的class对象 = class com.hspedu.reflection.A //11. getInterface:以Class[]形式返回接口信息,不包括父类 for (Class<?> anInterface : personCls.getInterfaces()) { System.out.println("接口信息 = " + anInterface); } //12.getAnnotations:以Annotation[]形式返回注解信息 for (Annotation annotation : personCls.getAnnotations()) { System.out.println("注解信息 = " + annotation); } } //第二组方法API:java.lang.reflect.Filed,java.lang.reflect.Method @Test public void api_02() throws ClassNotFoundException { //得到Class对象 Class<?> personCls = Class.forName("com.hspedu.reflection.Person"); //1. getModifiers():以int的形式返回修饰符 //规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16 //2. getType:以Class形式返回属性类型 //3. getName:获得属性名 for (Field declaredField : personCls.getDeclaredFields()) {//获得Field[] System.out.println("本类中所有属性 " + declaredField.getName() + " 属性的修饰符值 " + declaredField.getModifiers() + "该属性的类型 " + declaredField.getType()); } //1. getModifiers():以int的形式返回修饰符 //规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16 //2. getReturnType:以Class形式返回方法返回值类型 //3. getName:获得方法名 //4. getParameterTypes:以Class[]形式返回方法的形参列表 for (Method declaredMethod : personCls.getDeclaredMethods()) {//获得Method[] System.out.print("本类的方法 = " + declaredMethod.getName() + " 方法的修饰符值 " + declaredMethod.getModifiers() + "该方法返回值的类型 " + declaredMethod.getReturnType() + " 方法的参数 "); //输出方法的形参数组 for (Class<?> parameterType : declaredMethod.getParameterTypes()) { System.out.print(parameterType + " "); } System.out.println(); } //1. getModifiers():以int的形式返回修饰符 //规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16 //2. getName:获得构造器名 //4. getParameterTypes:以Class[]形式返回构造器的形参列表 for (Constructor<?> constructor : personCls.getDeclaredConstructors()) {//获取Constructor[] System.out.print("本类的public构造器 = " + constructor.getName()); for (Class<?> parameterType : constructor.getParameterTypes()) { System.out.print(" 该构造器的形参类型" + parameterType + " "); } System.out.println(); } } } class A{ public String hobby; public A() { } public void hi(){} } interface IA{} interface IB{} @Deprecated class Person extends A implements IA,IB{ //属性 public String name; String job; protected int age; private double sal; //构造器 public Person() { } private Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this.name = name; } //方法 public void m1(String name, int age, double sal){} protected String m2(){ return null; } void m3(){} private void m4(){} } /* 运行结果 ========================api_01()======================= com.hspedu.reflection.Person Person 本类及父类的公有属性name 本类及父类的公有属性hobby 本类中所有属性name 本类中所有属性job 本类中所有属性age 本类中所有属性sal 本类及其父类的公有方法 = public void com.hspedu.reflection.Person.m1(java.lang.String,int,double) 本类及其父类的公有方法 = public void com.hspedu.reflection.A.hi() 本类及其父类的公有方法 = public final void java.lang.Object.wait() throws java.lang.InterruptedException 本类及其父类的公有方法 = public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException 本类及其父类的公有方法 = public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException 本类及其父类的公有方法 = public boolean java.lang.Object.equals(java.lang.Object) 本类及其父类的公有方法 = public java.lang.String java.lang.Object.toString() 本类及其父类的公有方法 = public native int java.lang.Object.hashCode() 本类及其父类的公有方法 = public final native java.lang.Class java.lang.Object.getClass() 本类及其父类的公有方法 = public final native void java.lang.Object.notify() 本类及其父类的公有方法 = public final native void java.lang.Object.notifyAll() 本类的方法 = void com.hspedu.reflection.Person.m3() 本类的方法 = private void com.hspedu.reflection.Person.m4() 本类的方法 = protected java.lang.String com.hspedu.reflection.Person.m2() 本类的方法 = public void com.hspedu.reflection.Person.m1(java.lang.String,int,double) 本类的public构造器 = public com.hspedu.reflection.Person(java.lang.String) 本类的public构造器 = public com.hspedu.reflection.Person() 本类的所有构造器 = public com.hspedu.reflection.Person(java.lang.String) 本类的所有构造器 = private com.hspedu.reflection.Person(java.lang.String,int) 本类的所有构造器 = public com.hspedu.reflection.Person() package com.hspedu.reflection 父类的class对象 = class com.hspedu.reflection.A 接口信息 = interface com.hspedu.reflection.IA 接口信息 = interface com.hspedu.reflection.IB 注解信息 = @java.lang.Deprecated() ========================api_02()======================= 本类中所有属性 name 属性的修饰符值 1该属性的类型 class java.lang.String 本类中所有属性 job 属性的修饰符值 0该属性的类型 class java.lang.String 本类中所有属性 age 属性的修饰符值 4该属性的类型 int 本类中所有属性 sal 属性的修饰符值 2该属性的类型 double 本类的方法 = m3 方法的修饰符值 0该方法返回值的类型 void 方法的参数 本类的方法 = m4 方法的修饰符值 2该方法返回值的类型 void 方法的参数 本类的方法 = m2 方法的修饰符值 4该方法返回值的类型 class java.lang.String 方法的参数 本类的方法 = m1 方法的修饰符值 1该方法返回值的类型 void 方法的参数 class java.lang.String int double 本类的public构造器 = com.hspedu.reflection.Person 该构造器的形参类型class java.lang.String 本类的public构造器 = com.hspedu.reflection.Person 该构造器的形参类型class java.lang.String 该构造器的形参类型int 本类的public构造器 = com.hspedu.reflection.Person */