Javaインタプリタがロードできるクラスの解析
4123 ワード
public class ReflectionTest {
public static void main(String[] args) {
String name;
if (args.length > 0) {
name = args[0];
} else {
Scanner sc = new Scanner(System.in);
System.out.println(" :(e.g:java.util.Date):");
name = sc.next();
}
try {
Class c1 = Class.forName(name);
Class supperc1 = c1.getSuperclass();
String modifiers = Modifier.toString(c1.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
System.out.print("class" + name);
if (supperc1 != null && supperc1 != Object.class) {
System.out.print("extends" + supperc1.getName());
}
System.out.print("
{
");
printConstructors(c1);
System.out.println();
printMethods(c1);
System.out.println();
printFilds(c1);
System.out.println("
}
");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.exit(0);
}
private static void printConstructors(Class c1) {
Constructor[] constructors = c1.getDeclaredConstructors();
for (Constructor c : constructors) {
String name = c.getName();
System.out.println(" ");
String modifiers = Modifier.toString(c.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + "");
}
System.out.print(name + "(");
Class[] paramTypes = c.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0) {
System.out.print(",");
}
System.out.print(paramTypes[j].getName());
}
System.out.println(")");
}
}
private static void printMethods(Class c1) {
Method[] methods = c1.getDeclaredMethods();
for (Method m : methods) {
Class retType = m.getReturnType();
String name = m.getName();
System.out.println(" ");
String modifiers = Modifier.toString(m.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + "");
}
System.out.print(retType.getName() + "" + name + "(");
Class[] paramTypes = m.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
if (j > 0) {
System.out.print(",");
}
System.out.print(paramTypes[j].getName());
}
System.out.println(")");
}
}
private static void printFilds(Class c1) {
Field[] fields = c1.getDeclaredFields();
for (Field f : fields) {
Class retType = f.getType();
String name = f.getName();
System.out.println(" ");
String modifiers = Modifier.toString(f.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + "");
}
System.out.print(retType.getName() + "" + name + "(");
}
}
}
結果の例:
クラス名を入力:(e.g:java.util.Date):java.lang.Object public classjava.lang.Object{publicjava.lang.Object()
protectedvoidfinalize() public finalvoidwait() public finalvoidwait(long,int) public final nativevoidwait(long) publicbooleanequals(java.lang.Object) publicjava.lang.StringtoString() public nativeinthashCode() public final nativejava.lang.ClassgetClass() protected nativejava.lang.Objectclone() public final nativevoidnotify() public final nativevoidnotifyAll() private static nativevoidregisterNatives()
}