Java反射探索(三): 根据类模板的部分 API 获取类的声明信息

Java 的 Class 类 提供了很多 API, 通过这些 API 就可以操作对象, 属性, 行为等等;

 

测试前请自行穿件测试类: UserEntity

package devi.mint.reflect;

import devi.mint.entity.UserEntity;

import java.lang.reflect.*;

/**
 * 反射技术探索
 * 使用反射查看类信息
 */
public class ReflectCheckClassContent {

    private static UserEntity user = new UserEntity();

    public static void main(String[] args) {

        //===============获取模板类(开始)=============================
        //1. 在编译器不知道类名, 在运行期可以获得该类名时
        try {
            Class userEntityClass1 = Class.forName("devi.mint.entity.UserEntity");
            System.out.println("UserEntity 的模板类: " + userEntityClass1);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //2. 在编译器知道类名
        Class<UserEntity> userEntityClass2 = UserEntity.class;
        System.out.println("UserEntity 的模板类2: " + userEntityClass2);

        //3. 该类的实例对象已经得到, 通过实例对象获得 模板类
        Class userEntityClass3 = user.getClass();
        System.out.println("UserEntity 的模板类3: " + userEntityClass3);
        //================获取模板类(结束)=============================

        //================用反射查看类声明信息(开始)========================
        System.out.println("============== 声明 =================");

        String name = userEntityClass3.getSimpleName();
        System.out.println("类名: " + name);

        String packageName = userEntityClass3.getPackage().getName();
        System.out.println("包名: " + packageName);

        int modifiers = userEntityClass3.getModifiers();
        String modifier = Modifier.toString(modifiers);
        System.out.println("类修饰符(1: public)“ " + modifier);

        String superClassName = userEntityClass3.getSuperclass().getSimpleName();
        System.out.println("获取父类的名称: " + superClassName);

        Class[] interfaces = userEntityClass3.getInterfaces();
        String interfaceStr = "";
        if (interfaces.length != 0) {
            interfaceStr = "implement ";
            for (int i = 0; i <= interfaces.length - 1; i++ ){
                interfaceStr = interfaceStr + interfaces[i].getSimpleName();
                if (i != interfaces.length - 1) {
                    interfaceStr = interfaceStr + 1;
                }
            }
        }
        System.out.println("获取接口: " + interfaceStr);

        //打印完整的类声明
        System.out.println("打印完整的类声明: ");
        System.out.println("package " + packageName + ";");
        System.out.println(modifier + " " + name + " extend " + superClassName + " " + interfaceStr + "{}");
        //================用反射查看类声明信息(结束)========================

        //================用反射查看类属性信息(开始)========================
        System.out.println("============== 属性 =================");

        Field[] allFields = userEntityClass3.getFields();                 //获取所有的属性(包括继承获得的)
        Field[] declaredFields = userEntityClass3.getDeclaredFields();    // 获取自身声明的属性
        for (Field declaredField : declaredFields) {
            String fieldName = declaredField.getName();
            String fieldModifier = Modifier.toString(declaredField.getModifiers());
            String fieldType = declaredField.getType().getSimpleName();
            System.out.println(fieldModifier + " " + fieldType + " " + fieldName + ";");
        }

        //================用反射查看类属性信息(结束)========================

        //================用反射查看类构造信息(开始)========================
        System.out.println("============== 构造 =================");
        // 获取所有的公共构造
        Constructor[] allPublicConstructors = userEntityClass3.getConstructors();
        //获取所有的构造(包括私有构造)
        Constructor[] allConstructors = userEntityClass3.getDeclaredConstructors();
        for (Constructor constructor : allConstructors) {
            String consModifier = Modifier.toString(constructor.getModifiers());
            String consName = constructor.getName();
            Parameter[] consParameters = constructor.getParameters();
            Class[] consExceptionTypes = constructor.getExceptionTypes();
            String paraStr = "";
            //打印参数
            if(consParameters.length != 0){
                for (int i = 0; i <= consParameters.length - 1; i++) {
                    paraStr = paraStr
                            + consParameters[i].getType().getSimpleName()
                            + " "
                            + consParameters[i].getName();
                    if (i != consParameters.length - 1) {
                        paraStr += ",";
                    }
                }
            }
            //打印抛出异常
            String exStr = "";
            if (consExceptionTypes.length != 0) {
                exStr += " throws ";
                for (int i = 0; i <= consExceptionTypes.length - 1; i++) {
                    exStr = exStr
                            + consExceptionTypes[i].getSimpleName();
                    if (i != consExceptionTypes.length - 1) {
                        exStr += ",";
                    }
                }
            }

            System.out.println(consModifier + " " + consName + "(" + paraStr + ")" + exStr + "{}");
        }
        //================用反射查看类构造信息(结束)========================


        //================用反射查看类行为信息(开始)========================
        System.out.println("============== 行为方法 =================");
        Method[] declaredMethods = userEntityClass3.getDeclaredMethods();
        if (declaredFields.length != 0) {
            for (Method method : declaredMethods) {
                String methodMod = Modifier.toString(method.getModifiers());
                String returnType = method.getReturnType().getSimpleName();
                String methodName = method.getName();
                Parameter[] parameters = method.getParameters();
                Class<?>[] exceptionTypes = method.getExceptionTypes();
                //参数拼接
                String paramStr = "";
                if (parameters.length != 0) {
                    for (int i = 0; i <= parameters.length - 1; i++) {
                        paramStr = paramStr
                                + parameters[i].getType().getSimpleName()
                                + " "
                                + parameters[i].getName();
                     if (i != parameters.length - 1) {
                         paramStr = paramStr + ",";
                     }
                    }
                }
                //抛出异常拼接
                String exStr = "";
                if (exceptionTypes.length != 0) {
                    exStr += " throws ";
                    for (int i = 0; i <= exceptionTypes.length - 1; i++) {
                        exStr = exStr
                                + exceptionTypes[i].getSimpleName();
                        if (i != exceptionTypes.length - 1) {
                            exStr += ",";
                        }
                    }
                }

                System.out.println(methodMod + " "+ returnType  + " " + methodName + "(" + paramStr + ")" + exStr + "{}");
            }
        }
        //================用反射查看类行为信息(结束)========================



    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值