/* * 練習問題16.3 p.359 * すべての宣言されているメンバーとすべての継承されているpublicのメンバーに関する情報を表示するように * ClassContesntsを修正しなさい。 * 同じ物を2度表示しないようにしなさい。 */ package ch16.ex16_03; import java.lang.reflect.*; public class ClassContents { private static String[] memberName = new String[100]; public static void main(String[] args) { try { Class<?> c = Class.forName(args[0]); System.out.println(c); printMembers(c.getFields(), true); printMembers(c.getDeclaredFields(), false); printMembers(c.getConstructors(), true); printMembers(c.getDeclaredConstructors(), false); printMembers(c.getMethods(), true); printMembers(c.getDeclaredMethods(), false); } catch (ClassNotFoundException e) { System.out.println("unknown class: " + args[0]); } } private static void printMembers(Member[] mems, boolean isFirst) { Member m; // for (Member m : mems) checkMember: for (int i = 0; i < mems.length; i++) { m = mems[i]; if (m.getDeclaringClass() == Object.class) { continue; } if (true == isFirst) { memberName[i] = m.toString(); } if (false == isFirst) { for (int j = 0; j < memberName.length; j++) { if (m.toString().equals(memberName[j])) { continue checkMember; } } } String decl = m.toString(); System.out.print(" "); System.out.println(strip(decl, "java.lang.")); } } public static String strip(String source, String removeTarget) { return source.replaceAll(removeTarget, ""); } }