假設有人給我下面的源的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