1

我正在尝试使用 invoke() 方法从 gosu 暂存器调用私有方法。但我无法访问该私有方法。谁能告诉我在 GOSU 语言中调用私有方法的最佳方法。这是代码

try{
    var clazz = java.lang.Class.forName(ClaimSearchCriteriaImpl)
    var method = clazz.getDeclaredMethod("generateSimpleActiveClaimViewQuery", null)
       method.setAccessible(true)
    var ss =   method.invoke(clazz, null)as ClaimSearchCriteriaImpl
       print("Result.."+ss)
} catch(exception){
        print("***********"+exception)
}

当我尝试执行此代码时,出现以下异常

java.lang.IllegalAccessException: Class program_.__Program__505 can not access a member of class com.guidewire.cc.domain.claim.impl.ClaimSearchCriteriaImpl with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:105)
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:261)
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253)
    at java.lang.reflect.Method.invoke(Method.java:599)
    at program_.__Program__505.evaluate(Unknown Source)
    at gw.internal.gosu.parser.GosuProgram.runProgram(GosuProgram.java:421)
    at gw.internal.gosu.parser.GosuProgram.evaluate(GosuProgram.java:253)
    at gw.internal.gosu.parser.GosuProgram_Proxy.evaluate(gw.internal.gosu.parser.GosuProgram_Proxy:2)
    at gw.internal.gosu.parser.ExecutionEnvironment$1.evaluate(ExecutionEnvironment.java:543)
    at gw.internal.gosu.parser.ExecutionEnvironment$1.runScript(ExecutionEnvironment.java:523)
    at gw.internal.gosu.parser.ExecutionEnvironment$1.run(ExecutionEnvironment.java:489)
    at java.lang.Thread.run(Thread.java:724)
4

2 回答 2

0

@Shivanandam Sirmarigari 的解决方案现在确实有效,但存在一些问题。

第一,如前所述,您需要一个 on object 的实例来运行,来自 Method.invoke 的文档

/** @param obj 调用底层方法的对象 */

公共对象调用(对象 obj,对象... args)

第二个 ClaimSearchCriteriaImpl 实际上没有默认构造函数,所以你需要使用类似的东西

var obj = clazz.getDeclaredConstructor({ConstructorArgType}).newInstance({argTypeObj})

第三,您的 argTypeObj(可能是 obj 本身)实际上可能需要创建一个事务。

于 2018-06-20T09:44:17.373 回答
-1

**试试这个代码..你没有实例化**

 try{
var clazz = java.lang.Class.forName(ClaimSearchCriteriaImpl)
var method = clazz.getDeclaredMethod("generateSimpleActiveClaimViewQuery", null)
Object obj= clazz.newInstance();
   method.setAccessible(true)
var ss =   method.invoke(obj, null)as ClaimSearchCriteriaImpl
   print("Result.."+ss)
} catch(exception){
        print("***********"+exception)
}
于 2017-08-13T13:45:05.147 回答