Как получить определение класса Groovy/ Java-класса в виде байта []
Я хотел бы проанализировать отличный DSL, обезвоживать листовое укупорочное средство, отправить его по сети и повторно гидратировать его на принимающей стороне.
Итак, учитывая этот пример фрагмента DSL:
something {
title 'hello'
code {
println 'hello ${world}!'
}
}
Я разбираю сниплет с помощью GroovyShell и извлекаю замыкание, переданное code():
{
println 'hello ${world}!'
}
Теперь я хочу отправить дегидратированное замыкание по сети и повторно его на принимающей стороне, используя объект, который предоставляет свойство world
как владелец. Цель состоит в том, чтобы запустить замыкание и увидеть сообщение, распечатываемое в процессе сервера.
Я дошел до того, что у меня есть byte[]
представляющий сериализованный обезвоженный Closure
экземпляр в процессе получения, но десериализацию его с помощью ObjectInputStream
терпит неудачу с ClassNotFoundException
для бетона Closure
подкласс (названный как-то script1$_run_closure1$_closure2$_closure11$_closure113$_closure120$_closure128$_closure129
).
Таким образом, у меня была идея перенести определение класса замыканий (опять же, как byte[]
) и использовать ClassLoaderObjectInputStream
из обыкновенных вещей вместе с простыми ClassLoader
что кормили с классом byte[]
и что использует defineClass()
создать Class
объект для класса script1$_run_closure1$_closure2$_closure11$_closure113$_closure120$_closure128$_closure129
,
К сожалению, я застрял здесь и не могу найти способ получить определение класса подкласса groovy closure (script1$_run_closure1$...
) превращается в byte[]
, Есть ли способ добиться этого? Я копался в Google и GroovyShell
источники, но это просто не представляется возможным. Пожалуйста, докажите, что я не прав!