`

Java类分析器

 
阅读更多

这个功能对学习Java有些帮助,比如在学习内部类或者泛型的时候查看这些类的结构,可以帮助我们理解这些机制的本质。代码如下,感兴趣的可以看下。

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

import java.util.Scanner;

public class ClassAnalyzer {

    private static final String tab = "    ";//缩进

   

    public static void analyzer(String className) throws ClassNotFoundException{

        Class c = Class.forName(className);

        System.out.print(Modifier.toString(c.getModifiers()));

        System.out.print(" ");

        System.out.print(c.toString());

        Class superC = c.getSuperclass();

        if(superC != null){

            System.out.print(" extends "+superC.getName());

        }

        System.out.println("{");//类开始括号

        //打印域

        System.out.println(tab+"//域");

        Field[] fields = c.getDeclaredFields();

        for(Field field:fields){

            printField(field);

        }

        //打印构造器

        System.out.println(tab+"//构造器");

        Constructor[] constructors = c.getDeclaredConstructors();

        for(Constructor constructor:constructors){

            printConstructor(constructor);

        }

        //打印方法

        System.out.println(tab+"//方法");

        Method[] methods = c.getDeclaredMethods();

        for(Method method:methods){

            printMethod(method);

        }

        System.out.println("}");//类结束括号

    }

    //打印域

    private static void printField(Field field){

        System.out.print(tab);

        System.out.print(Modifier.toString(field.getModifiers()));

        System.out.print(" ");

        Class fieldType = field.getType();

        if(fieldType.isArray()){

            System.out.print(getArrayTypeName(fieldType));

        }else{

            System.out.print(field.getType().getName());

        }

        System.out.print(" ");

        System.out.print(field.getName());

        System.out.println(";");

    }

    //打印构造器

    private static void printConstructor(Constructor constructor){

        System.out.print(tab);

        System.out.print(Modifier.toString(constructor.getModifiers()));

        System.out.print(" ");

        System.out.print(constructor.getDeclaringClass().getSimpleName());

        Class[] varTypes = constructor.getParameterTypes();

        System.out.print("(");

        printParameters(varTypes);

        System.out.println(");");

    }

    //打印方法

    private static void printMethod(Method method){

        System.out.print(tab);

        System.out.print(Modifier.toString(method.getModifiers()));

        System.out.print(" ");

        Class returnType = method.getReturnType();

        if(returnType.isArray()){

            System.out.print(getArrayTypeName(returnType));

        }else{

            System.out.print(method.getReturnType().getName());

        }

        System.out.print(" ");

        System.out.print(method.getName());

        System.out.print("(");

        Class[] varTypes = method.getParameterTypes();

        printParameters(varTypes);

        System.out.print(")");

        //声明抛出的异常

        Class[] exceptionType = method.getExceptionTypes();

        if(exceptionType.length != 0){

            System.out.print(" throws ");

            for(int i=0;i<exceptionType.length;i++){

                System.out.print(exceptionType[i].getName());

                if(i < (exceptionType.length - 1)){

                    System.out.print(",");

                }

            }

        }

        System.out.println(";");

    }

    //打印构造器和方法的参数列表

    private static void printParameters(Class[] varTypes){

        if(varTypes.length > 0){

            for(int i = 0; i < varTypes.length; i++){

                if(varTypes[i].isArray()){

                    System.out.print(getArrayTypeName(varTypes[i]));

                }else{

                    System.out.print(varTypes[i].getName());

                }

                if( i < (varTypes.length - 1)){

                    System.out.print(", ");

                }

            }

        }else{

            System.out.print(" ");

        }

    }

   

    public static String getArrayTypeName(Class type){

        StringBuffer buffer = new StringBuffer(getArrayType(type).getName());

        int dimension = countArrayDimension(type);

        for(int i=1;i<=dimension;i++){

            buffer.append("[]");

        }

        return buffer.toString();

    }

   

    public static int countArrayDimension(Class type){

        int dimension = 0;

        if(type.isArray()){

            Class tempType = type;

            while((tempType = tempType.getComponentType()) != null){

                dimension++;

            }

        }

        return dimension;

    }

   

    public static Class getArrayType(Class type){

        Class arrayType = null;

        if(type.isArray()){

            Class tempType = type.getComponentType();

            do{

                arrayType = tempType;

            }while((tempType = tempType.getComponentType()) != null);

        }

        return arrayType;

    }

   

    public static void main(String[] args) {

        try {

            Scanner in = new Scanner(System.in);

            System.out.print("Input class name:");

            String className = in.next();

            in.close();

            analyzer(className);

        } catch (ClassNotFoundException ex) {

            ex.printStackTrace();

        }

    }

}

分享到:
评论

相关推荐

    node-v12.14.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于使用microPython的开发单片机设计源码.zip

    我们在单片机开发中常会遇到需要将UTF-8转换为GBK编码的需求。在了解各种编码格式的情况下可知, UFT-8不能直接转成GBK,需中转成unicode再转换为gbk。而unicode和gbk之间没有算法可以直接计算,需要查表方式获取。 网上有一些C语言实现的代码,我这里分享一种microPython的实现代码 接下来就是要考虑表的存储方式了,刚开始我想着把表存到代码里直接通过索引实现编码转换。但是gb2312有七千多个字符全部存储要耗费很大内存,即使是32位的esp32也只有512k的内存,加上其他资源的消耗,剩余的内存不足以存储编码转换表。 于是只能将表保存成一个文件(转化成bin文件会比较好,方法类似),通过读写文件来减少内存开销。 具体的查表就是简单的二分法

    基于VB实现的车队综合业务管理系统(论文+源代码)

    基于VB实现的车队综合业务管理系统(论文+源代码) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    基于知识图谱的推荐算法-NCFG的实现python源码+运行说明.zip

    基于知识图谱的推荐算法-NCFG的实现 运行环境 python == 3.7.0 torch == 1.12.0 pandas == 1.1.5 numpy == 1.21.6 sklearn == 0.0 数据集介绍 music-音乐 book-书籍 ml-电影 yelp-商户 文件介绍 ratings.txt:记录用户点击的项目,1代表点击了,0代表没有点击 kg.txt:知识图谱文件,第一列是头实体,第二列是尾实体,第三列是关系 user-list.txt:用户及其id文件,第一列是用户的id,第二列是用户 其余文件可忽略

    JAVA002打飞机游戏设计(程序+设计说明书).zip

    JAVA002打飞机游戏设计(程序+设计说明书).zip

    Engineering-Electromagnetic-Theory-Lab-3.pdf

    Engineering_Electromagnetic_Theory_Lab_3.pdf

    自己弄的基于matlab实现的多端直流配电网的仿真模型,是支撑自己小论文的东东 仿真环境是用的matlab

    自己弄的基于matlab实现的多端直流配电网的仿真模型,是支撑自己小论文的东东。仿真环境是用的matlab。

    BBR、A2O、MBR工艺比选.doc

    课程设计,污水处理设计方案

    DHT11温湿度传感器是一款高性能、低成本的数字温湿度复合传感器 它集成了温度感应和湿度感应功能,可以准确地测量环境中的温度和湿

    DHT11温湿度传感器是一款高性能、低成本的数字温湿度复合传感器。它集成了温度感应和湿度感应功能,可以准确地测量环境中的温度和湿度,并通过数字信号输出数据。以下是关于DHT11温湿度传感器的详细介绍: DHT11传感器内部包含一个NTC热敏电阻用于温度测量和一个薄膜电容湿度传感材料用于湿度测量。NTC热敏电阻的电阻值会随着温度的变化而变化,DHT11通过测量电阻值的变化来计算环境的温度。而薄膜电容湿度传感材料的电容值则会随着湿度的变化而变化,DHT11通过测量电容值的变化来计算环境的湿度。 DHT11传感器具有高精度、高可靠性和稳定性好的特点。其湿度测量范围为20%RH至90%RH,精度可达±5%RH;温度测量范围为-20℃至+60℃,精度可达±2℃。传感器的工作电压范围为3.3V至5.5V,工作电流较小,功耗低。此外,DHT11传感器还具有超长的信号传输距离和超强的抗干扰能力,可以在复杂的环境中稳定工作。 DHT11传感器采用单总线数字信号传输方式,通过单个引脚进行数据输入和输出。它使用特定的时序信号来传输温度和湿度数据,主机可以通过解析这些时序信号来获取温度和湿度的数值。这种

    某钢厂转炉浊环供水泵站给排水竣工图.zip

    污水处理

    delphi家庭财务管理系统.zip

    delphi家庭财务管理系统.zip

    node-v10.23.2-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    ASP+ACCESS网上人才信息管理系统(源代码+设计说明书).zip

    ASP+ACCESS网上人才信息管理系统(源代码+设计说明书).zip

    ASP基于BS结构的工厂设备管理系统的设计与开发(源代码+设计说明书).zip

    ASP基于BS结构的工厂设备管理系统的设计与开发(源代码+设计说明书).zip

    node-v10.23.3-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    埃森哲_组织设计的指导思想gl.ppt

    埃森哲_组织设计的指导思想gl.ppt

    卷积神经网络(Convolutional Neural Networks,CNN)是深度学习领域中一种非常重要的神经网络结构,特

    卷积神经网络(Convolutional Neural Networks,CNN)是深度学习领域中一种非常重要的神经网络结构,特别适用于处理图像和视频数据。以下是关于卷积神经网络的500字资源介绍: 卷积神经网络是一类包含卷积计算的前馈神经网络,它的核心在于“卷积与池化”操作。在卷积层中,神经元仅与部分邻层神经元连接,这种局部连接和权值共享的特性使得卷积神经网络能够以较小的计算量学习格点化特征,如像素和音频,且稳定有效。 卷积神经网络的主要构成包括卷积层、池化层和全连接层。卷积层通过卷积核对输入图像进行特征提取,生成特征图;池化层则对特征图进行下采样,降低数据维度,同时保留重要信息;全连接层则负责将提取的特征进行整合,用于分类或回归任务。 卷积神经网络在计算机视觉领域具有广泛的应用,如图像分类、目标检测、人脸识别等。通过训练大量的图像数据,卷积神经网络能够自动学习图像的特征表示,比传统的手工设计特征方法更加有效。此外,卷积神经网络也被应用于自然语言处理、语音识别等领域,并取得了显著的成果。 总之,卷积神经网络是一种强大的深度学习模型,它通过模拟人类的视觉系统来处理图像和视频数据

    基于VB+access实现的小区物业管理系统(系统+论文).zip

    基于VB+access实现的小区物业管理系统(系统+论文) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    基于matlab实现的用于边角网平差,可实现平差、误差椭圆绘制、成果坐标输出等 内附参考观测数据.rar

    基于matlab实现的用于边角网平差,可实现平差、误差椭圆绘制、成果坐标输出等 内附参考观测数据.rar

    ASP+ACCESS新闻发布系统(源代码+设计说明书).zip

    ASP+ACCESS新闻发布系统(源代码+设计说明书).zip

Global site tag (gtag.js) - Google Analytics