// onjava/atunit/ClassNameFinder.java// (c)2017 MindView LLC: see Copyright.txt// We make no guarantees that this code is fit for any purpose.// Visit http://OnJava8.com for more book information.// {java onjava.atunit.ClassNameFinder}package onjava.atunit;import java.io.*;import java.nio.file.*;import java.util.*;import onjava.*;public class ClassNameFinder {public static String thisClass(byte[] classBytes) {Map<Integer,Integer> offsetTable = new HashMap<>();Map<Integer,String> classNameTable =new HashMap<>();try {DataInputStream data = new DataInputStream(new ByteArrayInputStream(classBytes));int magic = data.readInt(); // 0xcafebabeint minorVersion = data.readShort();int majorVersion = data.readShort();int constantPoolCount = data.readShort();int[] constantPool = new int[constantPoolCount];for(int i = 1; i < constantPoolCount; i++) {int tag = data.read();// int tableSize;switch(tag) {case 1: // UTFint length = data.readShort();char[] bytes = new char[length];for(int k = 0; k < bytes.length; k++)bytes[k] = (char)data.read();String className = new String(bytes);classNameTable.put(i, className);break;case 5: // LONGcase 6: // DOUBLEdata.readLong(); // discard 8 bytesi++; // Special skip necessarybreak;case 7: // CLASSint offset = data.readShort();offsetTable.put(i, offset);break;case 8: // STRINGdata.readShort(); // discard 2 bytesbreak;case 3: // INTEGERcase 4: // FLOATcase 9: // FIELD_REFcase 10: // METHOD_REFcase 11: // INTERFACE_METHOD_REFcase 12: // NAME_AND_TYPEcase 18: // Invoke Dynamicdata.readInt(); // discard 4 bytesbreak;case 15: // Method Handledata.readByte();data.readShort();break;case 16: // Method Typedata.readShort();break;default:thrownew RuntimeException("Bad tag " + tag);}}short accessFlags = data.readShort();String access = (accessFlags & 0x0001) == 0 ?"nonpublic:" : "public:";int thisClass = data.readShort();int superClass = data.readShort();return access + classNameTable.get(offsetTable.get(thisClass)).replace('/', '.');} catch(IOException | RuntimeException e) {throw new RuntimeException(e);}}// Demonstration:public static voidmain(String[] args) throws Exception {PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**/*.class");// Walk the entire tree:Files.walk(Paths.get(".")).filter(matcher::matches).map(p -> {try {return thisClass(Files.readAllBytes(p));} catch(Exception e) {throw new RuntimeException(e);}}).filter(s -> s.startsWith("public:"))// .filter(s -> s.indexOf('$') >= 0).map(s -> s.split(":")[1]).filter(s -> !s.startsWith("enums.")).filter(s -> s.contains(".")).forEach(System.out::println);}}/* Output:onjava.ArrayShowonjava.atunit.AtUnit$TestMethodsonjava.atunit.AtUnitonjava.atunit.ClassNameFinderonjava.atunit.Testonjava.atunit.TestObjectCleanuponjava.atunit.TestObjectCreateonjava.atunit.TestPropertyonjava.BasicSupplieronjava.CollectionMethodDifferencesonjava.ConvertToonjava.Count$Booleanonjava.Count$Byteonjava.Count$Characteronjava.Count$Doubleonjava.Count$Floatonjava.Count$Integeronjava.Count$Longonjava.Count$Pbooleanonjava.Count$Pbyteonjava.Count$Pcharonjava.Count$Pdoubleonjava.Count$Pfloatonjava.Count$Pintonjava.Count$Plongonjava.Count$Pshortonjava.Count$Shortonjava.Countonjava.CountingIntegerListonjava.CountMaponjava.Countriesonjava.Enumsonjava.FillMaponjava.HTMLColorsonjava.MouseClickonjava.Naponjava.Nullonjava.Operationsonjava.OSExecuteonjava.OSExecuteExceptiononjava.Paironjava.ProcessFiles$Strategyonjava.ProcessFilesonjava.Rand$Booleanonjava.Rand$Byteonjava.Rand$Characteronjava.Rand$Doubleonjava.Rand$Floatonjava.Rand$Integeronjava.Rand$Longonjava.Rand$Pbooleanonjava.Rand$Pbyteonjava.Rand$Pcharonjava.Rand$Pdoubleonjava.Rand$Pfloatonjava.Rand$Pintonjava.Rand$Plongonjava.Rand$Pshortonjava.Rand$Shortonjava.Rand$Stringonjava.Randonjava.Rangeonjava.Repeatonjava.RmDironjava.Setsonjava.Stackonjava.Suppliersonjava.TimedAbortonjava.Timeronjava.Tupleonjava.Tuple2onjava.Tuple3onjava.Tuple4onjava.Tuple5onjava.TypeCounter*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。