原语的Java通用方法

原语的Java通用方法,java,generics,methods,primitive,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.doPrivil

我有一个非常有创意的解决方案,允许我的未签名代码通过我的签名库进行访问。尽管这种做法很糟糕,但我担心我没有其他解决方案(除了重写大量代码,然后需要重写回来)

我有以下课程:

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;
    }
}

这不是原始类的用途吗?(布尔,整数…)我不确定他们是否会这么做,我还没有检查

详细回答:克隆所有这些方法以返回原语

或者更短;您可以将所需的基本类型包装到对象中,即执行以下操作:

public class MyInt {
    public int intValue;
}

您得到
NullPointerException
的原因是您总是返回
null
。您调用
doPrivileged(…)
,但仍然返回
null
。尝试返回
doPrivileged(…)
的输出。从外观上看,自动(un)装箱在这里对输入和返回的输出都起作用

这对我来说很有效(我传入了一个基本int,并期望得到一个基本布尔值):

公共类ATest
{
公共静态void main(字符串[]args)引发UnsupportedEncodingException
{
int i=5;
对象等于=新对象();
布尔b=完全访问(i,“等于”,等于);
系统输出打印ln(b);
}
公共静态类已满
{
公共静态S访问(最终T对象、最终字符串函数、最终P参数)
{
return AccessController.doPrivileged(新的PrivilegedAction()
{
@凌驾
公众跑步
{
尝试
{
if(参数==null)
{
类[]argTypes={};
对象通过argv[]={};
返回object.getClass().getMethod(函数,argTypes)
.invoke(对象,passedArgv);
}
其他的
{
类[]argTypes={parameter.getClass()};
对象passedArgv[]={parameter};
返回object.getClass().getMethod(函数,argTypes)
.invoke(对象,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);
}
捕获(非法访问例外)
{
Logger.getLogger(full.class.getName()).log(Level.ALL,null,ex);
}
捕获(调用TargetException ex)
{
Logger.getLogger(full.class.getName()).log(Level.ALL,null,ex);
}
返回null;
}
});
}
}
}

另一方面,您可以使其更加健壮。当我传入一个
整数
而不是
对象
时,找不到equals方法,即使它是一个有效的方法调用。如果找不到具有给定
类的方法,则应再次检查类的父类。

这是一种方法。然而,它需要传递一个类作为参数,所以我可以看到returnvalue是什么类型,然后适当地包装它。如果没有其他可用选项,我将尝试此方法。
Boolean
类型不是原语(这就是为什么它可以为null),而是围绕
bool
的包装类。
bool
类型是一个原语——因此,NPE位于其他地方。谢谢!完全忽略了这一点!我还没有试过,但我认为它应该可以正常工作。我认为它在虚函数方面有更多的麻烦。
public class MyInt {
    public int intValue;
}
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;
                }
            });
        }
    }
}