Java_通过反射获取类的结构信息

第一组:java.lang.Class类

1.getName:获取全类名

2.getSimpleName:获取简单类名

3.getFields:获取所有public修饰的属性,包含本类以及父类的

4.getDeclaredFields:获取本类中所有属性

5.getMethods:获取所有public修饰的方法,包含本类以及父类的

6.getDeclaredMethods:获取本类中所有方法

7.getConstructors: 获取本类所有public修饰的构造器

8.getDeclaredConstructors:获取本类中所有构造器

9.getPackage:以Package形式返回 包信息

10.getSuperClass:以Class形式返回父类信息

11.getInterfaces:以Class[]形式返回接口信息

12.getAnnotations:以Annotation[] 形式返回注解信息

第二组:java.lang.reflect.Field类

1.getModifiners:以int形式返回修饰符

2.getType:以Class形式返回类型

3.getName:返回属性名

第三组:java.lang.reflect.Method类

1.getModifiers:以int形式返回修饰符

说明:默认修饰符是0,public是1,private是2,protected是4,static是8,final是16

2.getReturnType:以Class形式返回类型

3.getName:返回属性名

4.getParameterTypes:以Class[]返回参数类型数组

第四组:java.lang.reflect.Constructor类

1.getModifiers:以int形式返回修饰符

2.getName:返回构造器名(全类名)

3.getParameterTypes:以Class[]返回参数类型数组

java 复制代码
ackage com.reflection.ReflectionUtils;

import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

//演示如何通过反射获取类的结构信息
public class ReflectionUtils {
    public static void main(String[] args) throws Exception{
        new ReflectionUtils().API_01();
        new ReflectionUtils().API_02();
        new ReflectionUtils().API_03();
        new ReflectionUtils().API_04();
    }
    //第一组
    public void API_01()throws Exception{
//        第一组:java.lang.Class类
        //得到class对象
        Class<?> personClass = Class.forName("com.reflection.ReflectionUtils.Person");

//        1.getName:获取全类名
        System.out.println(personClass.getName());//com.reflection.ReflectionUtils.Person
//        2.getSimpleName:获取简单类名
        System.out.println(personClass.getSimpleName());//Person
//        3.getFields:获取所有public修饰的属性,包含本类以及父类的
        Field[] fields = personClass.getFields();
        for (Field f :fields) {
            System.out.println(f.getName());//name hobby 因为只有他俩是public修饰的
        }
//        4.getDeclaredFields:获取本类中所有属性
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField.getName());//name age job sal
        }
//        5.getMethods:获取所有public修饰的方法,包含本类以及父类的
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
//        6.getDeclaredMethods:获取本类中所有方法
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName());
        }
//        7.getConstructors: 获取本类所有public修饰的构造器
        Constructor<?>[] constructors = personClass.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor.getName());
        }
//        8.getDeclaredConstructors:获取本类中所有构造器
        Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor.getName());
        }
//        9.getPackage:以Package形式返回 包信息
        System.out.println(personClass.getPackage());
//        10.getSuperClass:以Class形式返回父类信息
        Class<?> superclass = personClass.getSuperclass();
        System.out.println(superclass);
//        11.getInterfaces:以Class[]形式返回接口信息
        Class<?>[] interfaces = personClass.getInterfaces();
        for (Class<?> anInterface : interfaces) {
            System.out.println(anInterface.getName());
        }
//        12.getAnnotations:以Annotation[] 形式返回注解信息
        Annotation[] annotations = personClass.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation.toString());
        }
    }

    //第二组
    public void API_02()throws Exception {
//        第二组:java.lang.reflect.Field类
        //得到class对象
        Class<?> personClass = Class.forName("com.reflection.ReflectionUtils.Person");
//        1.getModifiners:以int形式返回修饰符,默认修饰符是0,public是1,private是2,protected是4,static是8,final是16
//        2.getType:以Class形式返回类型
//        3.getName:返回属性名
        //获取本类中所有属性
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField.getName() + "该属性的修饰符值为" + declaredField.getModifiers()
             + " 该属性的类型为" + declaredField.getType());//name age job sal 1 4 0 2
        }
//        name该属性的修饰符值为1 该属性的类型为class java.lang.String
//        age该属性的修饰符值为4 该属性的类型为int
//        job该属性的修饰符值为0 该属性的类型为class java.lang.String
//        sal该属性的修饰符值为2 该属性的类型为double
    }

    //第三组
    public void API_03()throws Exception {
//        第三组:java.lang.reflect.Field类
        //得到class对象
        Class<?> personClass = Class.forName("com.reflection.ReflectionUtils.Person");
//        1.getModifiers:以int形式返回修饰符 说明:默认修饰符是0,public是1,private是2,protected是4,static是8,final是16
//        2.getReturnType:以Class形式返回类型
//        3.getName:返回属性名
//        4.getParameterTypes:以Class[]返回参数类型数组
        //getDeclaredMethods:获取本类中所有方法
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod.getName() + "该方法访问修饰符对应值为" + declaredMethod.getModifiers()
             + " 该方法的返回类型为" + declaredMethod.getReturnType() + " 该方法的属性名" + declaredMethod.getName());
            //输出当前方法形参数组情况
            Class<?>[] parameterTypes = declaredMethod.getParameterTypes();
            for (Class<?> parameterType : parameterTypes) {
                System.out.println(" 该方法形参类型" + parameterType.getName());
            }
        }
//        m1该方法访问修饰符对应值为1 该方法的返回类型为void 该方法的属性名m1
//        m2该方法访问修饰符对应值为4 该方法的返回类型为int 该方法的属性名m2
//        该方法形参类型java.lang.String
//                该方法形参类型int
//        该方法形参类型java.lang.String
//        m3该方法访问修饰符对应值为0 该方法的返回类型为void 该方法的属性名m3
//        m4该方法访问修饰符对应值为2 该方法的返回类型为void 该方法的属性名m4
    }
    //第四组
    public void API_04()throws Exception {
//        第四组:java.lang.reflect.Constructor类
        //得到class对象
        Class<?> personClass = Class.forName("com.reflection.ReflectionUtils.Person");
//        1.getModifiers:以int形式返回修饰符
//        2.getName:返回构造器名(全类名)
//        3.getParameterTypes:以Class[]返回参数类型数组
        //获取本类中所有构造器
        Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor.getName());
            Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();
            for (Class<?> parameterType : parameterTypes) {
                System.out.println(" 该构造器形参类型为" + parameterType);
            }
        }
//        该构造器形参类型为class java.lang.String
//        该构造器形参类型为int
//        该构造器形参类型为class java.lang.String
//        该构造器形参类型为double
    }
}
class A{
    public String hobby;

    public A() {
    }
}
@Deprecated
class Person extends A implements Serializable {
    //属性
    public String name;
    protected int age;
    String job;
    private double sal;

    //构造器
    private Person(String name, int age, String job, double sal) {
        this.name = name;
        this.age = age;
        this.job = job;
        this.sal = sal;
    }

    public Person() {
    }

    //方法
    public void m1(){}
    protected int m2(String name,int age,String job){
        return 1;
    }
    void m3(){}
    private void m4(){}
}
相关推荐
FL16238631293 分钟前
基于C#winform部署软前景分割DAViD算法的onnx模型实现前景分割
开发语言·算法·c#
2601_949817929 分钟前
大厂Java进阶面试解析笔记文档
java·笔记·面试
郭wes代码11 分钟前
大三Java课设:一行行敲出来的贪吃蛇,老师以为我是CV的
java·开发语言
John.Lewis29 分钟前
C++进阶(12)附加学习:STL之空间配置器(了解)
开发语言·c++·笔记
IGAn CTOU1 小时前
王炸级更新!Spring Boot 3.4 正式发布,新特性真香!
java·spring boot·后端
C雨后彩虹1 小时前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
23471021271 小时前
4.16 学习笔记
开发语言·软件测试·python
tycooncool1 小时前
Spring中的IOC详解
java·后端·spring
014-code1 小时前
日志规范:怎么写才不算写废话
java·开发语言·设计模式·日志
Binarydog_Lee1 小时前
Rust 核心机制:所有权、借用与生命周期
开发语言·rust