我有一个jar文件,我可以列出jar中的所有类。 jar中的类可以是public,protected或package scope。我想知道是否有可能告诉范围并且只列出公共类?
答案 0 :(得分:1)
你可以这样做,我能想到的不仅仅是一种方法,这里有两种:
您可以使用字节码操作工具来读取.class
文件并获取修改器。缺点是你需要一个额外的库。好处是这种方式非常安全,因为您不需要将类加载到VM中,只需加载到内存中,因此不会执行代码,并且.jar
类依赖于不可用的类,这种方式仍然有效。
您可以对此ClassLoader
使用.jar
并加载每个类,然后使用Reflection进行检查。好处是你不需要任何第三方库。缺点是,为了检查类,它们需要由ClassLoader
加载,这意味着将执行这些类的代码(静态初始化程序)。如果这是不受信任的第三方代码,您将首先安装SecurityManager
来沙箱这些类。另一个缺点是,如果这些类依赖于其他不可用的类(例如通过扩展此类不可用的类),则此方法将失败。
您可以使用javap
工具检查课程。
答案 1 :(得分:0)
如果您已经在jar中列出了类,则可以使用Reflection接口按名称(String)获取这些类的Class对象,然后使用Class接口来确定类的属性,例如isPublic,isFinal,或isStatic。
快速搜索显示:
http://tutorials.jenkov.com/java-reflection/classes.html#modifiers