Пусть кто-то дает мне Java байт-код следующего источника:Как прочитать окончательное значение строки в ASM?
class MyClass {
public static void foo() {
final String bar = "Hello";
}
}
Я хочу, чтобы сканировать все методы в этом классе MyClass
. Если какой-либо метод содержит переменную final
String
, называемую bar
, мне нужно вывести литеральное значение переменной. В этом случае Hello
.
мне удалось получить в переменную под названием bar
в методе следующим образом:
// Scala code
import scala.collection.JavaConversions._
import org.objectweb.asm._
import org.objectweb.asm.tree._
def processClass(is:java.io.InputStream) = {
val cn = new ClassNode
val cr = new ClassReader(is)
cr.accept(cn, 0)
is.close
val methods = cn.methods.asInstanceOf[java.util.List[MethodNode]]
val m = methods(0) // get first method as an example
val vars = m.localVariables.asInstanceOf[java.util.List[LocalVariableNode]];
val bar = vars.find(_.name == "bar").find(v => Type.getType(v.desc) == Type.getType(classOf[String]))
if (bar.isDefined) {
// how to read value of final variable "bar"?
// also how to check for final?
}
}
Однако, я не могу понять, как извлечь буквального "Hello"
. Любая помощь будет оценена по достоинству.
Ваш пример Java не компилировать. Если 'foo' является методом, то это должно быть' foo() '. Если 'foo' является классом, тогда' void' следует заменить на 'class'. Просьба уточнить. –
@TagirValeev Моя ошибка. Исправлена опечатка. – Jus12