jd.js revision 1157:04808fb1b059
1#// Usage: jjs -cp <asmtools.jar> jd.js -- <classname> [jdis|jdec] 2 3/* 4 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * - Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * - Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * - Neither the name of Oracle nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 22 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 23 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 25 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34// javap-like disassembler/decoder tool that disassembles/decodes 35// java classes but with OpenJDK AsmTools disassembler/decoder syntax. 36// You need to build asmtool.jar from OpenJDK codetools project 37// specify it with -cp option. 38 39// See also https://wiki.openjdk.java.net/display/CodeTools/AsmTools 40 41function usage() { 42 print("Usage: jjs -cp <asmtools.jar> jd.js -- <classname> [jdis|jdec]"); 43 exit(1); 44} 45 46if (arguments.length == 0) { 47 usage(); 48} 49 50// argument handling 51// convert to internal class name 52var className = arguments[0].replaceAll('\\.', '/'); 53var tool; 54if (arguments.length > 1) { 55 tool = arguments[1]; 56 switch (tool) { 57 case 'jdis': 58 case 'jdec': 59 break; 60 default: 61 usage(); 62 } 63} else { 64 tool = "jdis"; // default tool 65} 66 67// Java classes used 68var AsmTools = Java.type("org.openjdk.asmtools.Main"); 69var Files = Java.type("java.nio.file.Files"); 70var StandardCopyOption = Java.type("java.nio.file.StandardCopyOption"); 71 72// retrive input stream for .class bytes 73var cl = AsmTools.class.classLoader; 74var res = cl.getResource(className + ".class"); 75 76if (res) { 77 var is = res.openStream(); 78 var tmpPath; 79 try { 80 // copy the content of the .class to a temp file 81 tmpPath = Files.createTempFile("asmtools-", ".class"); 82 // mark as delete-on-exit 83 tmpPath.toFile().deleteOnExit(); 84 Files.copy(is, tmpPath, [ StandardCopyOption.REPLACE_EXISTING ]); 85 } finally { 86 is.close(); 87 } 88 89 // invoke asmtools Main 90 AsmTools.main([ tool, tmpPath.toString() ]); 91} else { 92 print("no such class: " + arguments[0]); 93 exit(1); 94} 95