# 反射獲取類的結構信息 1. **關於Class的API** 1. getName:獲取全類名 2. getSimpleName:獲取簡單類名 3. getFields:獲取所有Public修飾的屬性,包含本類及其父類(不僅僅是直接父類) 4. getDeclaredFields:獲取本類中的所有 ...
反射獲取類的結構信息
-
關於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 */