Как вызвать приватный метод в Gosu

Я пытаюсь вызвать частный метод из блокнота госу, используя метод invoke(). Но я не могу получить доступ к этому частному методу. Может ли кто-нибудь сказать мне, как лучше всего вызывать частные методы на языке 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)

person Dummy Data    schedule 15.10.2016    source источник
comment
Разве весь смысл ключевого слова «private» не в том, чтобы запретить другим классам или объектам использовать методы с этим модификатором? Мне кажется, что приложение работает так, как задумано.   -  person ebwb    schedule 08.11.2016
comment
ты понял это?   -  person dawogfather    schedule 29.03.2017


Ответы (2)


Решение @Shivanandam Sirmarigari действительно работает, но есть несколько проблем.

Во-первых, как уже упоминалось, вам нужен экземпляр объекта для запуска из документации Method.invoke

/** @param obj объект, из которого вызывается базовый метод */

вызов публичного объекта (Object obj, Object... args)

2-й ClaimSearchCriteriaImpl на самом деле не имеет конструктора по умолчанию, поэтому вам нужно использовать что-то вроде

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

3-й ваш argTypeObj (возможно, сам obj) может действительно нуждаться в создании транзакции.

person hakamairi    schedule 20.06.2018

**Попробуйте этот код.. Вы не создали экземпляр **

 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)
}
person Shivanandam    schedule 13.08.2017