`

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();

        }

    }

}

分享到:
评论

相关推荐

    java词法分析器java词法分析器.doc

    Java 词法分析器 Java 词法分析器是 Java 程序设计语言的词法分析工具,用于对 Java 源代码进行词法分析。以下是 Java 词法分析器的知识点: 1. Java 词法分析器的组成部分 Java 词法分析器由多个组成部分组成,...

    java 实现词法分析器以及语法分析器

    本文将详细介绍使用Java实现词法分析器和语法分析器的相关知识点。 词法分析,也称为扫描或Tokenization,是编译器前端的第一步。它的主要任务是读取源代码字符串,识别并生成一系列的符号或Token,这些Token代表了...

    语法分析器 Java

    在Java编程中,语法分析器扮演着至关重要的角色,确保输入的代码符合Java语言的语法规则。这个"语法分析器 Java"项目可能是为了帮助开发者在编写Java程序时检测语法错误,或者扩展到处理其他文件类型。 语法分析器...

    java词法分析器源代码

    "SynEdit"这个名字可能是这个Java词法分析器项目的名称,或者是它内部核心类的名称。它可能是一个自定义的词法分析器实现,用于处理Java源代码,也可能具备通用性,能够处理其他编程语言。Eclipse是一个流行的Java...

    语法分析器java实现

    根据提供的压缩包文件名称,`SyntaxAnalyzer`可能是实现语法分析器的Java类。这个类可能包含了词法分析器的输出处理逻辑,以及构造抽象语法树的核心算法。它可能会包含多个方法,如`analyze()`用于执行语法分析,`...

    java词法分析器

    本词法分析器能分析出java中常见的大部分字符,比如说运算符,界符,常量等等。对一些错误的字符也能读取出来,比如说非法运算符,非法标识符,非法浮点型等等。另外,本词法分析器对java中的注释也进行了处理,解析...

    java 语法分析器

    Java语法分析器是编程语言处理领域的一个重要工具,主要用于解析Java源代码,将人类可读的语句转化为计算机可理解的形式。在这个过程中,语法分析器扮演着关键角色,它依据语法规则对输入的源代码进行结构分析,构建...

    JAVA版的JAVA词法分析器

    JAVA版的JAVA词法分析器是一种用于解析JAVA源代码的工具,它主要负责将源代码文本转换成一系列有意义的标记,这一过程被称为词法分析或扫描。词法分析器是编译器或解释器的第一步,它将源代码分解成词汇单元,为后续...

    java 语法分析器 (带UI界面)

    【文件简介】 java 编写的语法分析器,详情可前往 https://blog.csdn.net/weixin_44155115/article/details/105199595 查看 【文件内容】 1. 源代码 2. jdk1.8 3. 可执行jar包 4. 使用说明

    java语言编写词法、语法、语义分析器

    本项目专注于使用Java实现词法、语法和语义分析器,这些都是编译器设计与实现的核心部分。以下是关于这些知识点的详细说明: **词法分析器(Lexer或Tokenizer)** 词法分析器是编译器的第一步,它将源代码分解成一...

    java 词法分析器

    `Analysis`可能是一个类或包名,包含了词法分析器的实现代码。而`输入`和`输出`目录可能分别存放待分析的Java源代码文件和词法分析器的输出结果,如标记列表。 了解词法分析器的工作原理对于深入理解编程语言的编译...

    java词法分析器源码

    这个是java词法分析器,包含全部的源码,我以前提交的只有一些源代码,不好意思。和其他的词法分析器不同,这个包含了图形模拟功能。就是能够把整个字符匹配过程显示出来。 &lt;br&gt; 我希望大家使用了后,能够提出...

    java文件分析器4

    java文件分析器4

    Java 实现词法分析器

    文件"Compiler"可能包含了项目的源代码,可能包括词法分析器的主要类、辅助工具类、测试用例等。深入研究这些源代码,可以更具体地了解这个词法分析器的实现细节和优化策略。例如,如何高效地处理长字符串,如何优化...

    简易java词法分析器

    本项目名为“简易java词法分析器”,它是一个基于Java实现的工具,用于分析Java源代码的词法结构。在这个项目中,开发者可能使用了类似于C++的编程技巧,因为C++也是一种常见的编程语言,它与Java有诸多相似之处。...

    java语言词法分析器

    2. **实现**:解释了如何使用Java编程语言实现词法分析器,可能包括自定义的类和方法,以及可能用到的第三方库。 3. **测试**:列出了进行的测试用例,包括正常情况和边缘情况,以验证词法分析器的正确性和健壮性。 ...

    Java词法分析器——C语言实现

    Java词法分析器是编程语言编译器或解释器的关键组成部分,它负责将源代码转换成可供解析器处理的标记序列。在这个特定的案例中,我们讨论的是一个使用C语言手动实现的Java词法分析器,而非依赖于像LEX这样的自动化...

Global site tag (gtag.js) - Google Analytics