gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:57:58 24 4
gpt4 key购买 nike

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

            processSecondPassesOfType(PkDrivenByDefaultMapsIdSecondPass.class);
processSecondPassesOfType(SetSimpleValueTypeSecondPass.class);
processSecondPassesOfType(CopyIdentifierComponentSecondPass.class);
processFkSecondPassInOrder();
processSecondPassesOfType(CreateKeySecondPass.class);
processSecondPassesOfType(SecondaryTableSecondPass.class);

现在我必须调用通过反射获取的私有(private)方法:

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

当我尝试运行此程序时,出现以下错误:

java.lang.IllegalArgumentException: object is not an instance of declaring class

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

最佳答案

m1.invoke(PkDrivenByDefaultMapsIdSecondPass.class);

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

因此,如果调用的方法是静态的,则调用将是;

m.invoke(null, methodArguments);

如果调用的方法不是静态的,则调用将是;

m.invoke(objectOnWhichMethodCalled, methodArguments);

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

关于java - 如何使用反射调用带有 .class(非对象)参数的 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48828112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com