一、使用技术
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&¶meters.length!=i) ;
判断只要不是最后一个参数就加上“,
Class.getDeclaredMethods();返回值类型Method[]
获取类中所有的普通方法
map.forEach((index,item) -> {})
遍历map需要两个参数,一个是下标,一个是值
list.forEach(it->{})
遍历list只能一个参数