Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用反射使用.class(非对象)参数调用java中的方法_Java_Reflection - Fatal编程技术网

如何使用反射使用.class(非对象)参数调用java中的方法

如何使用反射使用.class(非对象)参数调用java中的方法,java,reflection,Java,Reflection,我最近不得不使用反射来访问超类中的一些私有方法和字段。这是我开始使用反射之前的样子: processSecondPassesOfType(PkDrivenByDefaultMapsIdSecondPass.class); processSecondPassesOfType(SetSimpleValueTypeSecondPass.class); processSecondPassesOfType(CopyIdentifierComponen

我最近不得不使用反射来访问超类中的一些私有方法和字段。这是我开始使用反射之前的样子:

            processSecondPassesOfType(PkDrivenByDefaultMapsIdSecondPass.class);
        processSecondPassesOfType(SetSimpleValueTypeSecondPass.class);
        processSecondPassesOfType(CopyIdentifierComponentSecondPass.class);
        processFkSecondPassInOrder();
        processSecondPassesOfType(CreateKeySecondPass.class);
        processSecondPassesOfType(SecondaryTableSecondPass.class);
        Class<?> clazz = Class.forName("org.hibernate.cfg.Configuration");
        inSecondPass = true;
        Method m1 = clazz.getDeclaredMethod("processSecondPassesOfType", Class.class);
        m1.setAccessible(true);
        m1.invoke(PkDrivenByDefaultMapsIdSecondPass.class);
现在我必须调用通过反射获得的私有方法:

            processSecondPassesOfType(PkDrivenByDefaultMapsIdSecondPass.class);
        processSecondPassesOfType(SetSimpleValueTypeSecondPass.class);
        processSecondPassesOfType(CopyIdentifierComponentSecondPass.class);
        processFkSecondPassInOrder();
        processSecondPassesOfType(CreateKeySecondPass.class);
        processSecondPassesOfType(SecondaryTableSecondPass.class);
        Class<?> clazz = Class.forName("org.hibernate.cfg.Configuration");
        inSecondPass = true;
        Method m1 = clazz.getDeclaredMethod("processSecondPassesOfType", Class.class);
        m1.setAccessible(true);
        m1.invoke(PkDrivenByDefaultMapsIdSecondPass.class);

那么,如何使用反射调用具有非对象参数的方法呢?

除非这是一个静态的方法-您需要在上调用实例

在普通代码中,您执行以下操作:

foo.bar(x, y, z); 
调用
foo
上的
bar()

通过反射,逻辑是一种某种程度上颠倒的,正如你所说:

handleToBar = ...
handleToBar.invoke(foo, x, y, ...
换句话说:您不能“凭空”调用非静态方法。您必须提供一些要调用的对象


当然,通常的免责声明是:A)反射是“邪恶的”B)只有在绝对必要时才使用它,然后C)知道自己在做什么,D)避免将私有的东西称为——这些是实现细节,可能会发生更改。您只能在运行时发现,因为A)反射是“邪恶的”。

除非这是一个静态方法-您需要实例在上调用

在普通代码中,您执行以下操作:

foo.bar(x, y, z); 
调用
foo
上的
bar()

通过反射,逻辑是一种某种程度上颠倒的,正如你所说:

handleToBar = ...
handleToBar.invoke(foo, x, y, ...
换句话说:您不能“凭空”调用非静态方法。您必须提供一些要调用的对象

当然,通常的免责声明是:A)反射是“邪恶的”B)只有在绝对必要时才使用它,然后C)知道自己在做什么,D)避免将私有的东西称为——这些是实现细节,可能会发生更改。你只能在运行时发现,因为A)反射是“邪恶的”

m1.invoke(PkDrivenByDefaultMapsIdSecondPass.class)

当使用
java.lang.reflect.Method.invoke()
调用方法时,第一个参数是要调用此特定方法的对象实例。(如果该方法是静态的,则第一个参数应为null。)后续参数是该方法的参数

因此,如果调用的方法是静态的,那么调用将是

m.invoke(null, methodArguments);
m.invoke(objectOnWhichMethodCalled, methodArguments);
如果调用的方法不是静态的,那么调用将是静态的

m.invoke(null, methodArguments);
m.invoke(objectOnWhichMethodCalled, methodArguments);
如果底层方法抛出异常,它将被
java.lang.reflect.InvocationTargetException
包装。可以使用异常链接机制的
InvocationTargetException.getCause()
方法检索该方法的原始异常

m1.invoke(PkDrivenByDefaultMapsIdSecondPass.class)

当使用
java.lang.reflect.Method.invoke()
调用方法时,第一个参数是要调用此特定方法的对象实例。(如果该方法是静态的,则第一个参数应为null。)后续参数是该方法的参数

因此,如果调用的方法是静态的,那么调用将是

m.invoke(null, methodArguments);
m.invoke(objectOnWhichMethodCalled, methodArguments);
如果调用的方法不是静态的,那么调用将是静态的

m.invoke(null, methodArguments);
m.invoke(objectOnWhichMethodCalled, methodArguments);

如果底层方法抛出异常,它将被
java.lang.reflect.InvocationTargetException
包装。可以使用异常链接机制的
InvocationTargetException.getCause()
方法检索该方法的原始异常。

您必须创建一个实例,该实例包含要在其上调用methode的类:m1.invoke(clazz.newInstance());您必须创建一个实例来调用methode:m1.invoke(clazz.newInstance());谢谢,我意识到我必须将当前正在处理的类作为第一个参数中的对象。今天一定很累,幸好今天是星期五。干杯谢谢,我意识到我必须将当前正在处理的类作为第一个参数中的对象。今天一定很累,幸好今天是星期五。干杯我把它作为参数,它的工作完美无瑕,谢谢你的输入!我把它作为参数,它的工作完美无瑕,谢谢你的输入!