foldrr's weblog

旧ブログ http://d.hatena.ne.jp/foldrr/

Java リフレクション ユーティリティ

package ref;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class Ref {
    public static Object newInstance(String className, Object[] args){
        try {
            Class c = Class.forName("mods.C");
           
            Class[] argClasses = Ref.getArgClasses(args);
            Constructor cons = Ref.getConstructor(c, argClasses);
           
            return (Object)(cons.newInstance(args));
        }
        catch(ClassNotFoundException e){
            return null;
        }
        catch(NoSuchMethodException e){
            return null;
        }
        catch(InstantiationException e){
            return null;
        }
        catch(IllegalAccessException e){
            return null;
        }
        catch(InvocationTargetException e){
            return null;
        }
    }
   
   
    public static Object invokeMethod(
        Object target, String methodName, Object[] args){
        Method m;
        try {
            Class[] argClasses = Ref.getArgClasses(args);
            m = target.getClass().getMethod(methodName, argClasses);
        }
        catch(SecurityException e){
            return null;
        }
        catch(NoSuchMethodException e){
            return null;
        }
       
        Object r;
        try {
            r = m.invoke(target, args);
        }
        catch(IllegalArgumentException e){
            return null;
        }
        catch(IllegalAccessException e){
            return null;
        }
        catch(InvocationTargetException e){
            return null;
        }
       
        return r;
    }
   
   
    private static Class[] getArgClasses(Object[] args){
        Class[] argClasses = new Class[ args.length ];
        for(int i = 0; i < args.length; i++){
            argClasses[ i ] = args[ i ].getClass();
        }
        return argClasses;
    }
   
   
    @SuppressWarnings("unchecked")
    private static Constructor getConstructor(
        Class c, Class[] args) throws NoSuchMethodException{
        return c.getConstructor(args);
    }
}