/* * 練習問題16.5 p.363 * 個々のメンバーに対して得られるアノテーション情報を含むようにClassContentsを拡張子しなさい。 */ /* * 練習問題16.3 p.359 * すべての宣言されているメンバーとすべての継承されているpublicのメンバーに関する情報を表示するように * ClassContesntsを修正しなさい。 * 同じ物を2度表示しないようにしなさい。 */ package ch16.ex16_05; import java.lang.annotation.Annotation; import java.lang.reflect.*; public class ClassContents { private static String[] memberName = new String[100]; enum MemberType { FIELD, CONSTRUCTOR, METHOD; } public static void main(String[] args) { try { Class<?> c = Class.forName(args[0]); System.out.println(c); showAllAnnotation(c); printMembers(c.getFields(), true, MemberType.FIELD); printMembers(c.getDeclaredFields(), false, MemberType.FIELD); printMembers(c.getConstructors(), true, MemberType.CONSTRUCTOR); printMembers(c.getDeclaredConstructors(), false, MemberType.CONSTRUCTOR); printMembers(c.getMethods(), true, MemberType.METHOD); printMembers(c.getDeclaredMethods(), false, MemberType.METHOD); } catch (ClassNotFoundException e) { System.out.println("unknown class: " + args[0]); } } private static void printMembers(Member[] mems, boolean isFirst, MemberType type) { 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.")); Annotation[] tmp; switch(type) { case FIELD: tmp = ((Field)m).getAnnotations(); break; case CONSTRUCTOR: tmp = ((Constructor<?>)m).getAnnotations(); break; case METHOD: tmp = ((Method)m).getAnnotations(); break; default: tmp = null; break; } for (int j = 0; j < tmp.length; j++) { System.out.print(" "); System.out.println(tmp[j]); } } } public static String strip(String source, String removeTarget) { return source.replaceAll(removeTarget, ""); } public static void showAllAnnotation(Class<?> c) { Annotation[] tmp; tmp = c.getAnnotations(); for (int i = 0; i < tmp.length; i++) { System.out.println(tmp[i]); } } }