Второй вариант не выглядит сложным. Например, для библиотеки Javassist получение байт-кода метода так же просто, как
CtClass c = ClassPool.getDefault().get(className);
for (CtMethod m: c.getDeclaredMethod()) {
CodeAttribute ca = m.getMethodInfo().getCodeAttribute();
if (ca != null) { // i.e. if the method is not native
byte[] byteCode = ca.getCode();
...
}
}
Итак, если вы предполагаете, что результаты ваших методов зависят только от кода этих методов, это довольно просто.
UPDATE:
С другой стороны, поскольку ваши методы написаны на Scala, они, вероятно, содержат некоторые замыкания, так что части их кода находятся в анонимных классах, и вам может потребоваться как-то отследить использование этих классов.