Java 以编程方式列出jar中的所有公共类
我有一个jar文件,可以列出jar中的所有类。jar中的类可以是公共的、受保护的或包范围的。我想知道是否有可能告诉范围,只列出公共类 你可以这样做,我可以想出不止一种方法,这里有两种:Java 以编程方式列出jar中的所有公共类,java,Java,我有一个jar文件,可以列出jar中的所有类。jar中的类可以是公共的、受保护的或包范围的。我想知道是否有可能告诉范围,只列出公共类 你可以这样做,我可以想出不止一种方法,这里有两种: 您可以使用字节码操作工具读取.class文件并获取修饰符。缺点是你需要一个额外的库。这样做的好处是非常安全,因为您不需要将类加载到VM中,只需加载到内存中,因此不会执行任何代码,如果.jar类依赖于不可用的类,那么这种方法仍然有效 您可以将类加载器与此.jar一起使用,并加载每个类,然后使用反射检查它。这样做的
- 您可以使用字节码操作工具读取
文件并获取修饰符。缺点是你需要一个额外的库。这样做的好处是非常安全,因为您不需要将类加载到VM中,只需加载到内存中,因此不会执行任何代码,如果.class
类依赖于不可用的类,那么这种方法仍然有效.jar
- 您可以将
与此类加载器
一起使用,并加载每个类,然后使用反射检查它。这样做的好处是不需要任何第三方库。缺点是为了检查类,它们需要由.jar
加载,这意味着这些类的代码(静态初始值设定项)将被执行。如果这是不受信任的第三方代码,您将需要首先安装ClassLoader
来沙箱这些类。另一个缺点是,如果这些类依赖于其他不可用的类(例如通过扩展这些不可用的类),那么这种方法将失败SecurityManager
- 您可以使用
工具检查类javap
当然可以。例如,您可以使用反射加载类,并使用反射来拥有修饰符。你已经有一些代码了吗?类只有公共和包作用域。@AndriyKryvtsun类可以有保护作用域:
public class Foo{protected static class Bar{}protected class Buzz{}
问题是它们也可以有私有作用域:public class Foo{private static class Bar{}私有类Buzz{}
。