/** * 指定されたメンバを表示する * * @param Member[] mems 表示したいメンバ型オブジェクト */ public static void printMembers(Member[] mems) { for (Member m : mems) { // if(m.getDeclaringClass() == Object.class){ // continue; // } String decl = m.toString() + "\r\n"; display2.append(decl); } display2.append("\r\n"); }
private static Method getMethod( Object o, Object[] args, String methodName, Class<?>[] argsArray) { Method method = null; try { method = o.getClass().getMethod(methodName, argsArray); } catch (NoSuchMethodException e) { try { method = o.getClass().getDeclaredMethod(methodName, argsArray); } catch (NoSuchMethodException e2) { for (int i = 0; i < args.length; i++) { // 引数がひとつであれば大丈夫。引数が複数の場合はほぼ無理。一括で引数すべてのスーパークラス取得するので。 if (args[i].getClass().getSuperclass() != null) { // primitive, interface, Objectであればスーパークラスはnull argsArray[i] = args[i].getClass().getSuperclass(); } else { // すべてのインターフェースについてためす。j=0...,その後インターフェースのスーパークラス // if(args[i].getClass().getInterfaces() != null){ // Class<?>[] icls = args[i].getClass().getInterfaces(); // for(int j = 0; j < icls.length; j++){ // argsArray[i] = icls[j]; // } // } } counter++; if (counter == 5) { message = "NoSuchMethodException\r\n"; display.append(message); return null; } method = getMethod(o, args, methodName, argsArray); } } } return method; }
/** * 指定されたクラスのインスタンスを生成する * * @param Class<?> cls インスタンスを生成したいクラス */ public static Object getInstance(Class<?> cls) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, SecurityException, NoSuchMethodException { message = "以下のクラスのインスタンスを生成:" + cls.getName() + "\r\n"; display.append(message); return cls.newInstance(); }
public static void setElement(Object[] oArr, Object value, int index) throws Throwable { StringBuffer tempMessage = new StringBuffer(); tempMessage.append( "配列に値を代入。 インデックス: " + index + " " + "要素型: " + value.getClass().getName() + "\r\n"); int size = oArr.length; if (index >= 0 && index < size) { oArr[index] = (Object) value; } else { tempMessage.append("インデックスが不正です\r\n"); } message = tempMessage.toString(); display.append(message); }
/** * クラスのオブジェクトを取得する * * @param String name クラスの名前 */ public static Class<?> getClass(String name) { StringBuffer tempMessage = new StringBuffer(); Class<?> cls = null; try { cls = Class.forName(name); tempMessage.append("以下のクラスオブジェクトを取得: " + name + "\r\n"); } catch (ClassNotFoundException e) { e.printStackTrace(); tempMessage.append("ClassNotFoundException\r\n"); } message = tempMessage.toString(); display.append(message); return cls; }
/** * 指定されたクラスのインスタンスを生成する * * @param Class<?> cls インスタンスを生成したいクラス * @param Object... args インスタンス生成に用いるパラメータ */ public static Object getInstance(Class<?> cls, Object... args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, SecurityException, NoSuchMethodException { message = "以下のクラスのインスタンスを生成:" + cls.getName() + "\r\n"; display.append(message); if (args == null) { return cls.newInstance(); } else { Class<?>[] argsArray = new Class<?>[args.length]; Constructor<?> con = null; for (int i = 0; i < args.length; i++) { System.out.println(args[i]); argsArray[i] = getClassObject(args[i]); } con = cls.getDeclaredConstructor(argsArray); return con.newInstance(args); } }
public static void printMethods(Class<?> c) { display2.append("メソッド\r\n"); Method[] declaredmethods = c.getDeclaredMethods(); Method[] methods = c.getMethods(); ArrayList<Method> methodList = new ArrayList<Method>(methods.length); for (int i = 0; i < methods.length; i++) { methodList.add(methods[i]); } for (int i = 0; i < declaredmethods.length; i++) { if (!methodList.contains(declaredmethods[i])) { methodList.add(declaredmethods[i]); } } Method[] allMethods = new Method[methodList.size()]; for (int i = 0; i < allMethods.length; i++) { allMethods[i] = methodList.get(i); } printMembers(allMethods); }
public static void printConstructors(Class<?> c) { display2.append("コンストラクタ\r\n"); Constructor[] declaredconstructors = c.getDeclaredConstructors(); Constructor[] constructors = c.getConstructors(); ArrayList<Constructor> constructorList = new ArrayList<Constructor>(constructors.length); for (int i = 0; i < constructors.length; i++) { constructorList.add(constructors[i]); } for (int i = 0; i < declaredconstructors.length; i++) { if (!constructorList.contains(declaredconstructors[i])) { constructorList.add(declaredconstructors[i]); } } Constructor[] allConstructors = new Constructor[constructorList.size()]; for (int i = 0; i < allConstructors.length; i++) { allConstructors[i] = constructorList.get(i); } printMembers(allConstructors); }
public static void printFields(Class<?> c) { display2.append("フィールド\r\n"); Field[] declaredfields = c.getDeclaredFields(); Field[] fields = c.getFields(); ArrayList<Field> fieldList = new ArrayList<Field>(fields.length); for (int i = 0; i < fields.length; i++) { fieldList.add(fields[i]); } for (int i = 0; i < declaredfields.length; i++) { if (!fieldList.contains(declaredfields[i])) { fieldList.add(declaredfields[i]); } } Field[] allFields = new Field[fieldList.size()]; for (int i = 0; i < allFields.length; i++) { allFields[i] = fieldList.get(i); } printMembers(allFields); }
/** * オブジェクトのフィールドに値を設定する * * @param Object o フィールドに値を設定したいオブジェクト * @param String fieldName 値を設定したいフィールドの名前 * @param Object value フィールドに設定したい値 */ public static void setField(Object o, String fieldName, Object value) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Field field; try { field = o.getClass().getField(fieldName); } catch (NoSuchFieldException e) { try { field = o.getClass().getDeclaredField(fieldName); } catch (NoSuchFieldException e1) { field = o.getClass().getSuperclass().getField(fieldName); } } if (field.isAccessible() == false) { // privateメンバにもアクセス可能になる field.setAccessible(true); } field.set(o, value); message = "オブジェクト" + o + "のフィールド" + fieldName + "に値" + value + "をセット\r\n"; display.append(message); }
/** * ユーザが指定した型とサイズで配列を生成する * * @param Class<T> type 配列の要素の型 * @param int size 配列のサイズ */ @SuppressWarnings("unchecked") public static <T> T[] toArray(Class<T> type, int size) { message = "以下の配列を生成。要素型 " + type.getName() + " " + "サイズ: " + size + "\r\n"; display.append(message); return (T[]) Array.newInstance(type, size); }
/** * オブジェクトのメソッドを呼び出す * * @param Object o メソッドを呼び出したいオブジェクト * @param String methodName 呼び出したいメソッドの名前 * @param Object... args メソッドのパラメータ * @throws NoSuchMethodException */ public static Object invoke(Object o, String methodName, Object... args) throws SecurityException, ClassNotFoundException, NoSuchMethodException { StringBuffer tempMessage = new StringBuffer(); Method method = null; // //argsArray:メソッドの引数の型配列 // Class<?>[] argsArray = new Class<?>[args.length]; // for(int i = 0; i < args.length; i++){ // argsArray[i] = getClassObject(args[i]); // //スーパークラスを引数にとれるように修正 // } // try { // method = o.getClass().getMethod(methodName, argsArray); // } catch (NoSuchMethodException e) { // try{ // method = o.getClass().getDeclaredMethod(methodName, argsArray); // }catch (NoSuchMethodException e2) { // message = "NoSuchMethodException\r\n"; // display.append(message); // } // } ///////////////////////////////////////// // argsArray:メソッドの引数の型配列 Class<?>[] argsArray = new Class<?>[args.length]; for (int i = 0; i < args.length; i++) { argsArray[i] = getClassObject(args[i]); } method = getMethod(o, args, methodName, argsArray); //////////////////////////////////////// tempMessage.append("method: " + method.getName() + " is called.\r\n"); if (Modifier.isPrivate(method.getModifiers())) { method.setAccessible(true); } if (o.equals(null)) { if (Modifier.isStatic(method.getModifiers()) == false) { throw new NoSuchMethodException(); } } try { Type returnType = method.getGenericReturnType(); tempMessage.append("return type: " + returnType.toString() + "\r\n"); if (returnType.equals(Void.TYPE)) { tempMessage.append("return value: " + "なし\r\n"); } else { tempMessage.append("return value: " + method.invoke(o, args).toString() + "\r\n"); } message = tempMessage.toString(); display.append(message); return method.invoke(o, args); } catch (IllegalArgumentException e) { e.printStackTrace(); message = tempMessage.append("IllegalArgumentException\r\n").toString(); display.append(message); } catch (IllegalAccessException e) { e.printStackTrace(); message = tempMessage.append("IllegalAccessException\r\n").toString(); display.append(message); } catch (InvocationTargetException e) { e.printStackTrace(); tempMessage.append("InvocationTargetException\r\n"); message = tempMessage.append(e.getCause().toString() + "\r\n").toString(); display.append(message); } return null; }