反射 p4 反射获取类的结构信息,
分享于 点击 6496 次 点评:14
反射 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:获得属性名
-
关于Method的API
- getModifiers:以int的形式返回修饰符
规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
- getReturnType:以Class形式返回方法返回值类型
- getName:获得方法名
- getParameterTypes:以Class[]形式返回方法的形参列表
-
关于Constructor的API
- getModifiers:以int的形式返回修饰符
规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
- getName:获得构造器名
- getParameterTypes:以Class[]形式返回构造器的形参列表
-
案例演示
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
*/
关于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:获得属性名
关于Method的API
- getModifiers:以int的形式返回修饰符
规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16 - getReturnType:以Class形式返回方法返回值类型
- getName:获得方法名
- getParameterTypes:以Class[]形式返回方法的形参列表
关于Constructor的API
- getModifiers:以int的形式返回修饰符
规定说明:默认修饰符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16 - getName:获得构造器名
- getParameterTypes:以Class[]形式返回构造器的形参列表
案例演示
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
*/
用户点评