/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package scouter.util;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import scouter.lang.pack.XLogPack;
public class ClassUtil {
public static <V> Map<String, V> getPublicFinalNameMap(Class<?> cls, Class v) {
Map<String, V> map = new HashMap<String, V>();
Field[] fields = cls.getFields();
for (int i = 0; i < fields.length; i++) {
int mod = fields[i].getModifiers();
if (fields[i].getType().equals(v) == false) {
continue;
}
if (Modifier.isFinal(mod) && Modifier.isStatic(mod) && Modifier.isPublic(mod)) {
try {
String name = fields[i].getName();
Object value = fields[i].get(null);
map.put(name, (V) value);
} catch (Exception e) {
}
}
}
return map;
}
public static <V> Map<V, String> getPublicFinalValueMap(Class<?> cls, Class type) {
Map<V, String> map = new HashMap<V, String>();
Field[] fields = cls.getFields();
for (int i = 0; i < fields.length; i++) {
int mod = fields[i].getModifiers();
if (fields[i].getType().equals(type) == false) {
continue;
}
if (Modifier.isFinal(mod) && Modifier.isStatic(mod) && Modifier.isPublic(mod)) {
try {
String name = fields[i].getName();
Object value = fields[i].get(null);
map.put((V) value, name);
} catch (Exception e) {
}
}
}
return map;
}
public static <V> Map<V, String> getPublicFinalDeclaredValueMap(Class<?> cls, Class type) {
Map<V, String> map = new HashMap<V, String>();
Field[] fields = cls.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
int mod = fields[i].getModifiers();
if (fields[i].getType().equals(type) == false) {
continue;
}
if (Modifier.isFinal(mod) && Modifier.isStatic(mod) && Modifier.isPublic(mod)) {
try {
String name = fields[i].getName();
Object value = fields[i].get(null);
map.put((V) value, name);
} catch (Exception e) {
}
}
}
return map;
}
public static String getClassDescription(Class c1) {
int x = c1.getName().lastIndexOf(".");
StringBuffer sb = new StringBuffer();
if (x > 0) {
sb.append("package ").append(c1.getName().substring(0, x)).append(";\n\n");
}
int acc = c1.getModifiers();
mod(sb, acc, c1.isInterface());
if (c1.isInterface()) {
sb.append("interface ");
} else {
sb.append("class ");
}
if (x > 0) {
sb.append(c1.getName().substring(x + 1));
} else {
sb.append(c1.getName());
}
if (c1.getSuperclass() != null && c1.getSuperclass() != Object.class) {
sb.append(" extends ").append(c1.getSuperclass().getName());
}
Class[] inf = c1.getInterfaces();
for (int i = 0; i < inf.length; i++) {
if (i == 0) {
sb.append(" implements ");
}
if (i > 0)
sb.append(",");
sb.append(inf[i].getName());
}
sb.append("{\n");
Field[] f = c1.getDeclaredFields();
for (int i = 0; i < f.length; i++) {
sb.append("\t");
mod(sb, f[i].getModifiers(), c1.isInterface());
sb.append(toClassString(f[i].getType().getName())).append(" ");
sb.append(f[i].getName()).append(";\n");
}
Method[] m = c1.getDeclaredMethods();
if (f.length > 0 && m.length > 0) {
sb.append("\n");
}
for (int i = 0; i < m.length; i++) {
sb.append("\t");
mod(sb, m[i].getModifiers(), c1.isInterface());
sb.append(toClassString(m[i].getReturnType().getName())).append(" ");
sb.append(m[i].getName());
sb.append("(");
Class[] pc = m[i].getParameterTypes();
for (int p = 0; p < pc.length; p++) {
if (p > 0)
sb.append(",");
sb.append(toClassString(pc[p].getName())).append(" a" + p);
}
sb.append(")");
if (Modifier.isAbstract(m[i].getModifiers()) == false) {
sb.append("{...}\n");
} else {
sb.append(";\n");
}
}
sb.append("}");
return sb.toString();
}
private static String toClassString(String name) {
if (name.startsWith("java.lang")) {
return name.substring("java.lang".length() + 1);
}
return name;
}
private static void mod(StringBuffer sb, int acc, boolean isInterface) {
if (Modifier.isAbstract(acc) && isInterface == false) {
sb.append("abstract ");
}
if (Modifier.isProtected(acc)) {
sb.append("protected ");
}
if (Modifier.isPrivate(acc)) {
sb.append("private ");
}
if (Modifier.isPublic(acc)) {
sb.append("public ");
}
if (Modifier.isFinal(acc)) {
sb.append("final ");
}
if (Modifier.isSynchronized(acc)) {
sb.append("synchronized ");
}
}
public static byte[] getByteCode(Class c) {
if (c == null)
return null;
String clsAsResource = "/" + c.getName().replace('.', '/').concat(".class");
InputStream in = null;
try {
in = c.getResourceAsStream(clsAsResource);
if (in == null) {
return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buff = new byte[1024];
int n = 0;
while ((n = in.read(buff, 0, 1024)) >= 0) {
out.write(buff, 0, n);
}
return out.toByteArray();
} catch (Exception e) {
} finally {
FileUtil.close(in);
}
return null;
}
public static void main(String[] args) {
System.out.println(getClassDescription(XLogPack.class));
}
}