package com.github.ompc.greys.core.textui.ext; import com.github.ompc.greys.core.textui.TLadder; import com.github.ompc.greys.core.textui.TComponent; import com.github.ompc.greys.core.textui.TKv; import com.github.ompc.greys.core.textui.TTable; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.security.CodeSource; import static com.github.ompc.greys.core.util.GaStringUtils.*; import static org.apache.commons.lang3.StringUtils.EMPTY; /** * Java类信息控件 * Created by oldmanpushcart@gmail.com on 15/5/7. */ public class TClassInfo implements TComponent { private final Class<?> clazz; private final boolean isPrintField; public TClassInfo(Class<?> clazz, boolean isPrintField) { this.clazz = clazz; this.isPrintField = isPrintField; } @Override public String rendering() { return drawClassInfo(); } private String getCodeSource(final CodeSource cs) { if (null == cs || null == cs.getLocation() || null == cs.getLocation().getFile()) { return EMPTY; } return cs.getLocation().getFile(); } private String drawClassInfo() { final CodeSource cs = clazz.getProtectionDomain().getCodeSource(); final TTable tTable = new TTable(new TTable.ColumnDefine[]{ new TTable.ColumnDefine(50, TTable.Align.RIGHT), new TTable.ColumnDefine(80, TTable.Align.LEFT) }) .addRow("class-info", tranClassName(clazz)) .addRow("code-source", getCodeSource(cs)) .addRow("name", tranClassName(clazz)) .addRow("isInterface", clazz.isInterface()) .addRow("isAnnotation", clazz.isAnnotation()) .addRow("isEnum", clazz.isEnum()) .addRow("isAnonymousClass", clazz.isAnonymousClass()) .addRow("isArray", clazz.isArray()) .addRow("isLocalClass", clazz.isLocalClass()) .addRow("isMemberClass", clazz.isMemberClass()) .addRow("isPrimitive", clazz.isPrimitive()) .addRow("isSynthetic", clazz.isSynthetic()) .addRow("simple-name", clazz.getSimpleName()) .addRow("modifier", tranModifier(clazz.getModifiers())) .addRow("annotation", drawAnnotation()) .addRow("interfaces", drawInterface()) .addRow("super-class", drawSuperClass()) .addRow("class-loader", drawClassLoader()); if (isPrintField) { tTable.addRow("fields", drawField()); } return tTable.padding(1).rendering(); } private String drawField() { final StringBuilder fieldSB = new StringBuilder(); final Field[] fields = clazz.getDeclaredFields(); if (null != fields && fields.length > 0) { for (Field field : fields) { final TKv kvView = new TKv(new TTable.ColumnDefine(TTable.Align.RIGHT), new TTable.ColumnDefine(50, false, TTable.Align.LEFT)) .add("modifier", tranModifier(field.getModifiers())) .add("type", tranClassName(field.getType())) .add("name", field.getName()); final StringBuilder annotationSB = new StringBuilder(); final Annotation[] annotationArray = field.getAnnotations(); if (null != annotationArray && annotationArray.length > 0) { for (Annotation annotation : annotationArray) { annotationSB.append(tranClassName(annotation.annotationType())).append(","); } if (annotationSB.length() > 0) { annotationSB.deleteCharAt(annotationSB.length() - 1); } kvView.add("annotation", annotationSB); } if (Modifier.isStatic(field.getModifiers())) { final boolean isAccessible = field.isAccessible(); try { field.setAccessible(true); kvView.add("value", newString(field.get(null))); } catch (IllegalAccessException e) { // } finally { field.setAccessible(isAccessible); } }//if fieldSB.append(kvView.rendering()).append("\n"); }//for } return fieldSB.toString(); } private String drawAnnotation() { final StringBuilder annotationSB = new StringBuilder(); final Annotation[] annotationArray = clazz.getDeclaredAnnotations(); if (null != annotationArray && annotationArray.length > 0) { for (Annotation annotation : annotationArray) { annotationSB.append(tranClassName(annotation.annotationType())).append(","); } if (annotationSB.length() > 0) { annotationSB.deleteCharAt(annotationSB.length() - 1); } } else { annotationSB.append(EMPTY); } return annotationSB.toString(); } private String drawInterface() { final StringBuilder interfaceSB = new StringBuilder(); final Class<?>[] interfaceArray = clazz.getInterfaces(); if (null == interfaceArray || interfaceArray.length == 0) { interfaceSB.append(EMPTY); } else { for (Class<?> i : interfaceArray) { interfaceSB.append(i.getName()).append(","); } if (interfaceSB.length() > 0) { interfaceSB.deleteCharAt(interfaceSB.length() - 1); } } return interfaceSB.toString(); } private String drawSuperClass() { final TLadder tLadder = new TLadder(); Class<?> superClass = clazz.getSuperclass(); if (null != superClass) { tLadder.addItem(tranClassName(superClass)); while (true) { superClass = superClass.getSuperclass(); if (null == superClass) { break; } tLadder.addItem(tranClassName(superClass)); }//while } return tLadder.rendering(); } private String drawClassLoader() { final TLadder ladderView = new TLadder(); ClassLoader loader = clazz.getClassLoader(); if (null != loader) { ladderView.addItem(loader.toString()); while (true) { loader = loader.getParent(); if (null == loader) { break; } ladderView.addItem(loader.toString()); } } return ladderView.rendering(); } }