自分のjarファイルの中に同梱している特定パッケージ配下のクラス一覧を取得したいと考えています。
現在以下のようなパッケージ構成でプログラムを組んでいます。
+デフォルト・パッケージ
Test.java
+function
A.java
B.java
Test.javaの中では、以下のように記述しています。
java
1public class Test { 2 public static void main(String[] args) { 3 4 } 5 public static void classlist() { 6 GetClassList cl = new GetClassList(); 7 List<String> ls=null; 8 try { 9 ls = cl.ClassList(); 10 for(String s:ls) { 11 String[] ss = s.split("functions."); 12 pclass(ss[1]); 13 System.out.println(""); 14 } 15 } catch (Exception e) { 16 e.printStackTrace(); 17 } 18 } 19 public static void pclass(String s) { 20 Class<?> cl; 21 Method method; 22 try { 23 cl = Class.forName("functions."+s.toUpperCase()); 24 method = cl.getMethod("Message"); 25 method.invoke(cl.newInstance()); 26 } catch (ClassNotFoundException | NoSuchMethodException | SecurityException |IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) { 27 e.printStackTrace(); 28 } 29 30 } 31 32}
GetClassList.javaは以下の通りです。
java
1public class GetClassList { 2 private static final String PK_NAME = "functions"; 3 public List<String> ClassList() throws Exception { 4 //ExecPath ep = new ExecPath(); 5 //xxxxxxxxxxxGetClassesInPackage ip = new xxxxxxxxxxxGetClassesInPackage(); 6 //ip.getClassesInPackage(PK_NAME); 7 //String eps=ep.ExecPath("ComTestTools"); 8 String packageName = PK_NAME; 9 List<Class<?>> classes = getClasses(packageName); 10 List<String> ls=new ArrayList<String>(); 11 for (Class<?> class1 : classes) { 12 //System.out.println(class1.getName()); 13 ls.add(class1.getName()); 14 } 15 return ls; 16 } 17 private static List<Class<?>> getClasses(String packageName) 18 throws IOException, URISyntaxException, ClassNotFoundException { 19 ClassLoader cl = Thread.currentThread().getContextClassLoader(); 20 Enumeration<URL> e = cl.getResources(packageName.replace(".", "/")); 21 List<Class<?>> classes = new ArrayList<>(); 22 for (; e.hasMoreElements();) { 23 URL url = e.nextElement(); 24 File dir = new File(url.getPath()); 25 for (String path : dir.list()) { 26 if (path.endsWith(".class")) { 27 classes.add(Class.forName(packageName + "." + path.substring(0, path.length() - 6))); 28 } 29 } 30 } 31 return classes; 32 } 33}
A.javaは以下の通りです。(ほぼB.javaも同じです)
java
1public class A{ 2 public void Message() { 3 String st= "テスト"; 4 System.out.println(st); 5 } 6}
上記コーディングでEclipse上で実行すると、A.java、B.javaのMessageが表示されるのですが、
なぜかjarファイル化してしまうと、上記メッセージが表示されませんでした。
(正確には、classすら見えていないようでした)
なぜEclipse上では表示できてjar化すると表示できなくなるのでしょうか。
また、どのようにしたらjar化しても参照することができるでしょうか。
すみませんが、よろしくお願いいたします。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/08 22:03