Java 以编程方式列出jar中的所有公共类

Java 以编程方式列出jar中的所有公共类,java,Java,我有一个jar文件,可以列出jar中的所有类。jar中的类可以是公共的、受保护的或包范围的。我想知道是否有可能告诉范围,只列出公共类 你可以这样做,我可以想出不止一种方法,这里有两种: 您可以使用字节码操作工具读取.class文件并获取修饰符。缺点是你需要一个额外的库。这样做的好处是非常安全,因为您不需要将类加载到VM中,只需加载到内存中,因此不会执行任何代码,如果.jar类依赖于不可用的类,那么这种方法仍然有效 您可以将类加载器与此.jar一起使用,并加载每个类,然后使用反射检查它。这样做的

我有一个jar文件,可以列出jar中的所有类。jar中的类可以是公共的、受保护的或包范围的。我想知道是否有可能告诉范围,只列出公共类

你可以这样做,我可以想出不止一种方法,这里有两种:

  • 您可以使用字节码操作工具读取
    .class
    文件并获取修饰符。缺点是你需要一个额外的库。这样做的好处是非常安全,因为您不需要将类加载到VM中,只需加载到内存中,因此不会执行任何代码,如果
    .jar
    类依赖于不可用的类,那么这种方法仍然有效

  • 您可以将
    类加载器
    与此
    .jar
    一起使用,并加载每个类,然后使用反射检查它。这样做的好处是不需要任何第三方库。缺点是为了检查类,它们需要由
    ClassLoader
    加载,这意味着这些类的代码(静态初始值设定项)将被执行。如果这是不受信任的第三方代码,您将需要首先安装
    SecurityManager
    来沙箱这些类。另一个缺点是,如果这些类依赖于其他不可用的类(例如通过扩展这些不可用的类),那么这种方法将失败

  • 您可以使用
    javap
    工具检查类


如果已经在jar中列出了类,那么可以使用反射接口按名称(字符串)获取这些类的类对象,然后使用类接口确定类的属性,例如isPublic、isFinal或isStatic

快速搜索可显示:


当然可以。例如,您可以使用反射加载类,并使用反射来拥有修饰符。你已经有一些代码了吗?类只有公共和包作用域。@AndriyKryvtsun类可以有保护作用域:
public class Foo{protected static class Bar{}protected class Buzz{}
问题是它们也可以有私有作用域:
public class Foo{private static class Bar{}私有类Buzz{}