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(){}
}
相关推荐
还是鼠鼠2 小时前
SQL语句执行很慢,如何分析呢?
java·数据库·mysql·面试
爱装代码的小瓶子2 小时前
【c++知识铺子】封装map和set(详细版)
android·java·c++
2201_757830872 小时前
tlias的部门的增删改查操作
java·开发语言
云和数据.ChenGuang2 小时前
批量给100台服务器装系统,还要完成后续的配置和软件部署
运维·服务器·开发语言·mysql
刺客xs2 小时前
Qt-----QSS样式表
开发语言·javascript·qt
锥锋骚年2 小时前
golang 发送内网邮件和外网邮件
开发语言·后端·golang
wjs20242 小时前
JavaScript for 循环详解
开发语言
东华万里3 小时前
第十五讲 指针 从本质吃透 C 语言指针(上)
c语言·开发语言