java - プリミティブのJavaジェネリックメソッド

java generics methods primitive

署名されたライブラリを介して署名されていないコードにすべてのアクセスを許可する非常に創造的なソリューションがあります。悪い習慣ですが、他の解決策がないことを恐れています(多くのコードを書き直した場合を除き、書き直す必要があります)。

私は次のクラスを持っています:

public abstract class full {
    public static <T,S,P> S access(final T object, final String function, final P parameter) {
        AccessController.doPrivileged(new PrivilegedAction<S>() {
            @Override
            public S run() {
                try {
                    if (parameter == null) {
                        Class[] argTypes = { };
                        Object passedArgv[] = { };
                        return (S)object.getClass().getMethod(function, argTypes).invoke(object, passedArgv);
                    } else {
                        Class[] argTypes = { parameter.getClass() };
                        Object passedArgv[] = { parameter };
                        return (S)object.getClass().getMethod(function, argTypes).invoke(object, passedArgv);
                    }
                } catch (NoSuchMethodException ex) {
                    Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
                } catch (SecurityException ex) {
                    Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InvocationTargetException ex) {
                    Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
                }
                return null;
            }
        });
        return null;
    }
}


オブジェクトを返す関数には適していますが、プリミティブには適していません。
ブールbool = full.access(..);
ジェネリックメソッドはプリミティブを処理できないため、nullpointerになります。

適切なアプローチを取る方法についてのアイデアはありますか?

テストする:

public static Boolean test() {
    return true;
}

public Main() {
    System.out.println(((Boolean)redirect.full.access(this, "test", null)));
}
答え
NullPointerExceptionが返されるのは、常にnullが返されるためです。 doPrivileged(...)を呼び出しても、まだnullが返されます。 doPrivileged(...)の出力を返してみてください。見た目では、自動(非)ボクシングはここでは入力と返された出力の両方で機能しています。

これは私にとってはうまくいきました(私はプリミティブintを渡し、プリミティブなブール値を期待していました):

public class ATest
{
    public static void main(String[] args) throws UnsupportedEncodingException
    {
        int i = 5;
        Object equals = new Object();

        boolean b = full.access(i, "equals", equals);

        System.out.println(b);
    }

    public static class full
    {
        public static <T, S, P> S access(final T object, final String function, final P parameter)
        {
            return AccessController.doPrivileged(new PrivilegedAction<S>()
            {
                @Override
                public S run()
                {
                    try
                    {
                        if (parameter == null)
                        {
                            Class[] argTypes = {};
                            Object passedArgv[] = {};
                            return (S) object.getClass().getMethod(function, argTypes)
                                    .invoke(object, passedArgv);
                        }
                        else
                        {
                            Class[] argTypes = { parameter.getClass() };
                            Object passedArgv[] = { parameter };
                            return (S) object.getClass().getMethod(function, argTypes)
                                    .invoke(object, passedArgv);
                        }
                    }
                    catch (NoSuchMethodException ex)
                    {
                        Logger.getLogger(full.class.getName()).log(Level.ALL, null, ex);
                    }
                    catch (SecurityException ex)
                    {
                        Logger.getLogger(full.class.getName()).log(Level.ALL, null, ex);
                    }
                    catch (IllegalAccessException ex)
                    {
                        Logger.getLogger(full.class.getName()).log(Level.ALL, null, ex);
                    }
                    catch (InvocationTargetException ex)
                    {
                        Logger.getLogger(full.class.getName()).log(Level.ALL, null, ex);
                    }
                    return null;
                }
            });
        }
    }
}


別の注意として、これをより堅牢にすることができます。 Integerの代わりにObjectを渡したときに、equalsメソッドが見つかりませんでしたが、有効なメソッド呼び出しでした。指定されたClassのメソッドが見つからない場合は、クラスの親クラスをもう一度確認する必要があります。
関連記事

java - Stripes Frameworkの会話スコープ

java - AspectJでメソッドを注釈付き引数と一致させる方法

java - 金額をDoubleとして格納しますが、BigDecimalを使用して値を計算します

java - Java(Clojure)から書き込み、Paraviewで読み取ることができるデータ形式は何ですか?

java - MATLAB Javaクラスパスの問題

java - 2つの基準をHibernate ORする

java - コンソールJavaアプリケーションの一般的な統合テストフレームワークはありますか?

java - Java SEを使用してXMLノードを削除する

java - clojure / enliveを使用してテーブル行の属性クラスを動的に設定するにはどうすればよいですか?

java - Swingフォーカスが失われたinputverifier