Accessing module internals from bytecode rewriting agent
Martin Buchholz
martinrb at google.com
Tue Apr 25 03:26:34 UTC 2017
We've been playing with byteman. If I have a simple rule that accesses a
private field,
RULE trace java.util.PriorityQueue_add
CLASS java.util.PriorityQueue
METHOD add
AT EXIT
IF true
DO traceln(java.util.Arrays.toString($0.queue))
ENDRULE
Then with jdk8 I get output like:
[1, 2, 3]
but in jdk9 we fail with
java.lang.IllegalArgumentException: illegal lookupClass: class
java.util.PriorityQueue
Bytecode rewriting agents have the power to inject code into classes; they
should somehow also be able to reflectively inspect those same classes!
But how? We ran into similar problems trying to port java agents at Google
to jdk9.
Details:
JAVA_TOOL_OPTIONS="-javaagent:${BYTEMAN_JAR}=script:${BYTEMAN_SCRIPT},boot:${BYTEMAN_JAR}"
[java] java.lang.IllegalArgumentException: illegal lookupClass: class
java.util.PriorityQueue
[java] at
java.base/java.lang.invoke.MethodHandleStatics.newIllegalArgumentException(MethodHandleStatics.java:123)
[java] at
java.base/java.lang.invoke.MethodHandles$Lookup.checkUnprivilegedlookupClass(MethodHandles.java:1003)
[java] at
java.base/java.lang.invoke.MethodHandles$Lookup.<init>(MethodHandles.java:750)
[java] at
java.base/java.lang.invoke.MethodHandles.privateLookupIn(MethodHandles.java:205)
[java] at
org.jboss.byteman.jigsaw/org.jboss.byteman.jigsaw.JigsawAccessEnabler.createFieldGetter(JigsawAccessEnabler.java)
[java] at
org.jboss.byteman.rule.Rule.addAccessibleFieldGetter(Rule.java:1043)
[java] at
org.jboss.byteman.rule.expression.FieldExpression.lookupField(FieldExpression.java:549)
[java] at
org.jboss.byteman.rule.expression.FieldExpression.typeCheckAny(FieldExpression.java:201)
[java] at
org.jboss.byteman.rule.expression.FieldExpression.typeCheck(FieldExpression.java:110)
[java] at
org.jboss.byteman.rule.expression.MethodExpression.findMethod(MethodExpression.java:297)
More information about the core-libs-dev
mailing list