/* package whatever; // don't place package name! */
import javax.tools.ToolProvider;
import java.lang.invoke.MethodHandles;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone extends Superclass {
// unqualified invocation of staticMethod() in the context of Ideone
staticMethod();
// qualified invocation using Ideone.staticMethod()
Ideone.staticMethod();
// qualified invocation using Superclass.staticMethod() (the declaring class)
Superclass.staticMethod();
// other example: invoking java.awt.Window.getWindows() via javax.swing.JFrame target
javax.
swing.
JFrame.
getWindows(); }
private Ideone() {}
}
class Superclass {
static boolean disassembled;
static void staticMethod() {
if(!disassembled) {
disassembled = true;
disasm();
}
}
private static void disasm() {
try {
MethodHandles.lookup().unreflect(
Class.forName("com.sun.tools.javap.Main", false, ToolProvider.getSystemToolClassLoader())
.
getMethod("main",
String[].
class)) .
asVarargsCollector(String[].
class) .invoke("-c", Ideone.class.getName());
} catch(Throwable t
) { t.
printStackTrace(); } }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmF4LnRvb2xzLlRvb2xQcm92aWRlcjsKaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlczsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUgZXh0ZW5kcyBTdXBlcmNsYXNzIHsKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CiAgICAgICAgLy8gdW5xdWFsaWZpZWQgaW52b2NhdGlvbiBvZiBzdGF0aWNNZXRob2QoKSBpbiB0aGUgY29udGV4dCBvZiBJZGVvbmUKICAgICAgICBzdGF0aWNNZXRob2QoKTsKICAgICAgICAvLyBxdWFsaWZpZWQgaW52b2NhdGlvbiB1c2luZyBJZGVvbmUuc3RhdGljTWV0aG9kKCkKICAgICAgICBJZGVvbmUuc3RhdGljTWV0aG9kKCk7CiAgICAgICAgLy8gcXVhbGlmaWVkIGludm9jYXRpb24gdXNpbmcgU3VwZXJjbGFzcy5zdGF0aWNNZXRob2QoKSAodGhlIGRlY2xhcmluZyBjbGFzcykKICAgICAgICBTdXBlcmNsYXNzLnN0YXRpY01ldGhvZCgpOwogICAgICAgIC8vIG90aGVyIGV4YW1wbGU6IGludm9raW5nIGphdmEuYXd0LldpbmRvdy5nZXRXaW5kb3dzKCkgdmlhIGphdmF4LnN3aW5nLkpGcmFtZSB0YXJnZXQKICAgICAgICBqYXZheC5zd2luZy5KRnJhbWUuZ2V0V2luZG93cygpOwogICAgfQogICAgcHJpdmF0ZSBJZGVvbmUoKSB7fQp9CmNsYXNzIFN1cGVyY2xhc3MgewogICAgc3RhdGljIGJvb2xlYW4gZGlzYXNzZW1ibGVkOwogICAgc3RhdGljIHZvaWQgc3RhdGljTWV0aG9kKCkgewogICAgICAgIGlmKCFkaXNhc3NlbWJsZWQpIHsKICAgICAgICAgICAgZGlzYXNzZW1ibGVkID0gdHJ1ZTsKICAgICAgICAgICAgZGlzYXNtKCk7CiAgICAgICAgfQogICAgfQogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkaXNhc20oKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgTWV0aG9kSGFuZGxlcy5sb29rdXAoKS51bnJlZmxlY3QoCiAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLmphdmFwLk1haW4iLCBmYWxzZSwgVG9vbFByb3ZpZGVyLmdldFN5c3RlbVRvb2xDbGFzc0xvYWRlcigpKQogICAgICAgICAgICAgICAgLmdldE1ldGhvZCgibWFpbiIsIFN0cmluZ1tdLmNsYXNzKSkKICAgICAgICAgICAgICAgIC5hc1ZhcmFyZ3NDb2xsZWN0b3IoU3RyaW5nW10uY2xhc3MpCiAgICAgICAgICAgICAgICAuaW52b2tlKCItYyIsIElkZW9uZS5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIHQpIHsgdC5wcmludFN0YWNrVHJhY2UoKTsgfQogICAgfQp9