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)