2016-03-01 31 views
1

我有一個jar文件,我可以列出jar中的所有課程。 jar中的類可以是public,protected或者package作用域。我想知道是否可以告訴範圍並且只列出公開課?以編程方式列出所有公開課程

+1

當然這是可能的。例如,您可以使用https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html加載類,並使用反射使修飾符https://docs.oracle.com /javase/7/docs/api/java/lang/Class.html#getModifiers()。你有一些代碼了嗎? – superbob

+0

類只有_public_和_package_作用域。 –

+0

@AndriyKryvtsun類可以有保護作用域:'public class Foo {protected static class Bar {} protected class Buzz {}}'這個問題有什麼問題呢,它們也可以有私有作用域:'public class Foo {private static class Bar {}私人課Buzz {}}'。 –

回答

1

你可以這樣做,我能想到的不止一種方法如何做到這一點,這裏有兩個:

  • 您可以使用一個字節碼操作工具讀取.class文件並獲得修改。缺點是你需要一個額外的庫。好處在於這種方式非常安全,因爲您不需要將該類加載到VM中,只需將其加載到內存中,因此不會執行代碼,並且如果類依賴於不可用的類,則這種方式會仍然工作。

  • 您可以使用ClassLoader與此.jar並加載每個類,然後使用反射檢查它。好處是你不需要任何第三方庫。缺點是爲了檢查這些類,它們需要由ClassLoader加載,這意味着這些類的代碼(靜態初始化器)將被執行。如果這是不可信的第三方代碼,您需要首先安裝SecurityManager以沙箱這些類。另一個缺點是,如果這些類依賴於其他不可用的類(例如擴展這些不可用的類),這種方法將失敗。

相關問題