找出使用给定API的哪些类

找出使用给定API的哪些类,第1张

找出使用给定API的哪些类

您可以使用ASM的

Remapper
类发现这些类(信不信由你)。该类实际上是要替换字节码中所有出现的类名。但是,出于您的目的,它不需要替换任何东西。

这可能没有多大意义,因此这里是一个示例…

首先,创建一个子类

Remapper
该子类的唯一目的是拦截对该
mapType(String)
方法的所有调用,并记录其参数供以后使用。

public class ClassNameRecordingRemapper extends Remapper {    private final Set<? super String> classNames;    public ClassNameRecordingRemapper(Set<? super String> classNames) {        this.classNames = classNames;    }    @Override    public String mapType(String type) {        classNames.add(type);        return type;    }}

现在您可以编写这样的方法:

public Set<String> findClassNames(byte[] bytepre) {    Set<String> classNames = new HashSet<String>();    ClassReader classReader = new ClassReader(bytepre);    ClassWriter classWriter = new ClassWriter(classReader, 0);    ClassNameRecordingRemapper remapper = new ClassNameRecordingRemapper(classNames);    classReader.accept(remapper, 0);    return classNames;}

实际获取所有类的字节码是您的责任。


由Seanizer(OP)编辑

我接受这个答案,但是由于上面的代码不太正确,因此我将插入我的用法:

public static class Collector extends Remapper{    private final Set<Class<?>> classNames;    private final String prefix;    public Collector(final Set<Class<?>> classNames, final String prefix){        this.classNames = classNames;        this.prefix = prefix;    }        @Override    public String mapDesc(final String desc){        if(desc.startsWith("L")){ this.addType(desc.substring(1, desc.length() - 1));        }        return super.mapDesc(desc);    }        @Override    public String[] mapTypes(final String[] types){        for(final String type : types){ this.addType(type);        }        return super.mapTypes(types);    }    private void addType(final String type){        final String className = type.replace('/', '.');        if(className.startsWith(this.prefix)){ try{     this.classNames.add(Class.forName(className)); } catch(final ClassNotFoundException e){     throw new IllegalStateException(e); }        }    }    @Override    public String mapType(final String type){        this.addType(type);        return type;    }}public static Set<Class<?>> getClassesUsedBy(    final String name,   // class name    final String prefix  // common prefix for all classes   // that will be retrieved    ) throws IOException{    final ClassReader reader = new ClassReader(name);    final Set<Class<?>> classes =        new TreeSet<Class<?>>(new Comparator<Class<?>>(){ @Override public int compare(final Class<?> o1, final Class<?> o2){     return o1.getName().compareTo(o2.getName()); }        });    final Remapper remapper = new Collector(classes, prefix);    final ClassVisitor inner = new EmptyVisitor();    final RemappingClassAdapter visitor =        new RemappingClassAdapter(inner, remapper);    reader.accept(visitor, 0);    return classes;}

这是一个使用以下内容进行测试的主类:

public static void main(final String[] args) throws Exception{    final Collection<Class<?>> classes =        getClassesUsedBy(Collections.class.getName(), "java.util");    System.out.println("Used classes:");    for(final Class<?> cls : classes){        System.out.println(" - " + cls.getName());    }}

这是输出:

Used classes: - java.util.ArrayList - java.util.Arrays - java.util.Collection - java.util.Collections - java.util.Collections - java.util.Collections$AsLIFOQueue - java.util.Collections$CheckedCollection - java.util.Collections$CheckedList - java.util.Collections$CheckedMap - java.util.Collections$CheckedRandomAccessList - java.util.Collections$CheckedSet - java.util.Collections$CheckedSortedMap - java.util.Collections$CheckedSortedSet - java.util.Collections$CopiesList - java.util.Collections$EmptyList - java.util.Collections$EmptyMap - java.util.Collections$EmptySet - java.util.Collections$ReverseComparator - java.util.Collections$ReverseComparator2 - java.util.Collections$SelfComparable - java.util.Collections$SetFromMap - java.util.Collections$SingletonList - java.util.Collections$SingletonMap - java.util.Collections$SingletonSet - java.util.Collections$SynchronizedCollection - java.util.Collections$SynchronizedList - java.util.Collections$SynchronizedMap - java.util.Collections$SynchronizedRandomAccessList - java.util.Collections$SynchronizedSet - java.util.Collections$SynchronizedSortedMap - java.util.Collections$SynchronizedSortedSet - java.util.Collections$UnmodifiableCollection - java.util.Collections$UnmodifiableList - java.util.Collections$UnmodifiableMap - java.util.Collections$UnmodifiableRandomAccessList - java.util.Collections$UnmodifiableSet - java.util.Collections$UnmodifiableSortedMap - java.util.Collections$UnmodifiableSortedSet - java.util.Comparator - java.util.Deque - java.util.Enumeration - java.util.Iterator - java.util.List - java.util.ListIterator - java.util.Map - java.util.Queue - java.util.Random - java.util.RandomAccess - java.util.Set - java.util.SortedMap - java.util.SortedSet


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5428143.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-11
下一篇2022-12-11

发表评论

登录后才能评论

评论列表(0条)

    保存