代码实现UML图的自动生成

一、使用技术

	1、java反射机制
	2、java中foreach

思路:

创建一个Map<String,list>,第一个参数存放的是,属性、构造方法,普通方法,类名的区分,可以随意定义。
定义四个list分别存放在从Class的方法中获取的内容,存放前生成
格式如:|+Person(name:String,age:int)
最后使用foreach进行遍历输出(打印在了控制台)

代码:

提示:本代码中的for()都可以使用foreach进行替换

/***
     *
     * @param pack 包名
     * @param Class_name 类名
     *                   例如:
     *                     test("four_1","Person");
     */
    public static void test(String pack, String Class_name) {
    
    
        Class<?> Class = null;
        try {
    
    
            Class = java.lang.Class.forName(pack + "." + Class_name);
        } catch (ClassNotFoundException e) {
    
    
            e.printStackTrace();
        }
        if (Class == null) {
    
    
            return;
        }

        Field[] fields = Class.getDeclaredFields();
        Map<String, List<String>> map = new TreeMap<>();
        List<String> list = new ArrayList<>();
        List<String> listMethod = new ArrayList<>();
        List<String> listField = new ArrayList<>();
        List<String> listConstructor = new ArrayList<>();

        list.add(Class_name);

        for (Field field : fields) {
    
    
            listField.add("-" + field.getName() + ":" + field.getType().getName().replace("java.lang.", ""));
        }

        for (Constructor<?> constructor : Class.getConstructors()) {
    
    
            Parameter[] parameters = constructor.getParameters();
            String constr = constructor.getName();
            StringBuilder param = new StringBuilder();
            int i = 0;
            for (Parameter par : parameters) {
    
    
                i++;
                param.append(par.getName()).append(":").append(par.getType().getName());
                if (parameters.length != 1 && parameters.length != i) {
    
    
                    param.append(",");
                }
            }
            listConstructor.add("+" + constr.replace(pack + ".", "") + "(" + param.append(")").toString().replace("java.lang.", ""));
        }

        for (Method method : Class.getDeclaredMethods()) {
    
    
            StringBuilder str = new StringBuilder();
            for (Parameter par : method.getParameters()) {
    
    
                str.append(par.getName()).append(":").append(par.getType().getName().replace("java.lang.", ""));
            }
            listMethod.add("+" + method.getName() + "(" + str.toString() + "):" + method.getReturnType().getName().replace("java.lang.", ""));
        }
        map.put("4Method", listMethod);
        map.put("3Constructor", listConstructor);
        map.put("2Field", listField);
        map.put("1Class", list);
        map.forEach((index, item) -> {
    
    
            if (!"4Method".equals(index))
                System.out.println("----------------------------------");
            item.forEach(it -> {
    
    
                System.out.println("|" + it);
            });
        });
    }
代码解释:
	java.lang.Class.forName(pack + "." + Class_name); 
生成Class反射对象,存在ClassNotFoundException 异常(类不存在)。
	Class.getDeclaredFields(); 返回值类型Field[]
获取所有的属性
	for (Field field : fields) ;
这是for的另一种用法:for(类型  变量名:变量名(数组或集合))
	“”.replace("java.lang.","")这是字符串替换函数,
原因:在默认获取的类型中String类型会存在"java.lang.",而UML图中只需要String就可以了
	Class.getConstructors();返回值类型Constructor<?>[]
获取类中的所有构造函数(包括有无参数)
	if (parameters.length != 1&&parameters.length!=i) ;
判断只要不是最后一个参数就加上“,
	Class.getDeclaredMethods();返回值类型Method[]
获取类中所有的普通方法
	map.forEach((index,item) -> {})
遍历map需要两个参数,一个是下标,一个是值
	list.forEach(it->{})
遍历list只能一个参数

效果图:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/G_liunian/article/details/108868844