자바 관련 질문 인데, jar파일을 이용한 패키지명 과 메서드명을 알고 싶은데요

shei77의 이미지


이번에 제가 맡은 업무가 좀 노가다(?)성이 짙어서

보다 쉽게 할 수 있는 방법을 찾고 있습니다.

jar파일에 있는 패키지 클래스들과 클래스의 메서드들을

모두 실행 시켜 화면에 출력 시켜야 되는데,

혹시 보다 쉽게 할 수 있는 방안이 있을까요?

잘 하시는 분 말로는 CATCH DOC을 쓰면 된다고 하는데,

그게 뭔지 잘 모르겠군요... ㅠㅠ;;

neocoin의 이미지

그냥 시험삼아 작성해 봤습니다. java 안쓰다보니 기억 더듬기에 좋네요.

아직도 java 표준에 jar 파일내에 ClassLoader.getClasses("packageName") 같은 기능 안들어 갔나보네요.

아래 코드는 이렇게 실행하면

java -classpath . PackageUtils /jar_file_path

이렇게 출력해 줍니다.

class 이름
   method 이름1
   method 이름2

Security 에러가 날수있는데, 해당 클래스는 필터링 하시면 될것 같네요.
(ant.jar 로 해봤는데, Exception이 잡히지 않고 Security 에러나는 경우가 있네요. )

남은건 아래 소스에 오브젝트 생성 추가하고 method invoke 추가해서 원하는 메소드들 전부 실행시켜서 얻으면 될듯하네요.
생성자나 파라미터는 제가 알수 있는 범위가 아니니 패스 ;;

PackageUtils.java

import java.util.jar.*;
import java.util.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
 
public class PackageUtils {
 
    public static List<String> getResourceNames(String jarName){
        ArrayList names = new ArrayList ();
 
        try{
            JarInputStream jarFile = new JarInputStream(new FileInputStream (jarName));
 
            JarEntry jarEntry; 
            while(null != (jarEntry = jarFile.getNextJarEntry()) ) {
              names.add(jarEntry.getName());
            }
        }
        catch( Exception e){
            e.printStackTrace ();
        }
        return names;
    }
 
    public static void main (String[] args) throws Exception {
        File f = new File(args[0]);
        List<String> list =  PackageUtils.getResourceNames(f.getAbsolutePath());
        List<String> names = new ArrayList<String>();
 
        for(String s : list) {
            if (s.endsWith(".class")){
                String n = s.replaceAll("/",".").replaceAll(".class$","");
                names.add(n);
            }
        }
 
        URL jarfile = new URL("jar","","file:" + f.getAbsolutePath() +"!/");
        URLClassLoader cl = URLClassLoader.newInstance(new URL[] {jarfile });
 
        for(String n : names){
            try{
                Class c = cl.loadClass(n);
                System.out.println(c.getName());
                for(Method m : c.getMethods()){
                    System.out.println("    " + m.getName());
                }
            } catch(Exception e){
                System.out.println("fail load : "+ n);
                e.printStackTrace();
            }
        }
    }
}
shei77의 이미지

----------------------------------------------------------
It's feasible to make an inspiration on your own.

----------------------------------------------------------
It's feasible to make an inspiration on your own.

sephi의 이미지

내용 무