编译和执行java源代码而不知道主方法在哪里?

编译和执行java源代码而不知道主方法在哪里?,java,compilation,Java,Compilation,我面临以下问题: 我将收到一个或多个.java文件。其思想是使编译和执行过程自动化 我没有编写或查看收到的.java源文件 在多个目录中可能有一个或多个文件 所有这些都是在linux(Debian/CentOS)下完成的 下面是一个例子: 收到2份文件: SomeFile.java和SomeOtherFile.java(这一个有静态公共void main(字符串args[]){}方法,但我不知道!) 进程将拾取文件并以以下方式进行编译: javac-编码UTF-8-源路径-d.*。java

我面临以下问题:

我将收到一个或多个.java文件。其思想是使编译和执行过程自动化

  • 我没有编写或查看收到的.java源文件
  • 在多个目录中可能有一个或多个文件
  • 所有这些都是在linux(Debian/CentOS)下完成的
  • 下面是一个例子:

    • 收到2份文件:
    • SomeFile.java和SomeOtherFile.java(这一个有静态公共void main(字符串args[]){}方法,但我不知道!
    • 进程将拾取文件并以以下方式进行编译: javac-编码UTF-8-源路径-d.*。java
    所以我的问题是:我不知道哪个包(如果有的话)包含Main方法,所以我不知道执行什么

    java packageName.SomeOtherFile
    
    有很多方法:

  • 获取、解析源代码、查找方法
  • 编译所有内容,使用反射检查生成的*.class文件,找到方法
  • 对于数量足够少的文件,请全部尝试

  • 我以前写过这样的东西:

    package vonbulow.nicki;
    
    import java.io.ByteArrayInputStream;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FilenameFilter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.jar.Manifest;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    /**
     *
     * @author Nicki
     */
    public class AppLoader extends ClassLoader {
    
        private static final String userdir = System.getenv("USERPROFILE");
        private static final AppLoader instance = new AppLoader();
    
        private static HashMap<String, Class> loaded = new HashMap<String, Class>();
    
        public static void loadapp(final String name) {
    
            if(loaded.containsKey(name)) {
                Thread d = new Thread(new Runnable(){
                    public void run(){
                        try {
                            Class c = loaded.get(name);
                            Method m = c.getDeclaredMethod("main", String[].class);
                            m.invoke(null, (Object[])new String[]{null});
                        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
    
                        }
                    }
                });
                d.start();
                return;
            }
    
            File ud = new File(userdir+"\\nvbapp");
            ud.mkdir();
            File[] fa = ud.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return name.toLowerCase().endsWith(".appn");
                }
            });
    
            for(final File f:fa) {
                if(f.getName().split("\\.")[0].equalsIgnoreCase(name)) {
                    Thread t = new Thread(new Runnable() {
                        public void run() {
                            runapp(f, name);
                        }
                    });
                    t.start();
                }
            }
        }
    
        private static void runapp(File f, String nam) {
    
            List<Class> classes = new ArrayList<Class>();
            ZipFile jf;
            String name = "";
            try {
                jf = new ZipFile(f);
                Enumeration<? extends ZipEntry> eze = jf.entries();
                while(eze.hasMoreElements()){
                    ZipEntry ze = eze.nextElement();
                    if(ze.getName().endsWith(".class")&&!ze.isDirectory()){
                        InputStream fis = jf.getInputStream(ze);
                        byte[] bytes = new byte[(int)ze.getSize()];
                        fis.read(bytes);
                        classes.add(instance.defineClass(getClassName(bytes), bytes, 0, bytes.length));
                    }
                    if(ze.getName().equalsIgnoreCase("META-INF/MANIFEST.MF")) {
                        Manifest manifest = new Manifest(jf.getInputStream(ze));
                        name = manifest.getMainAttributes().getValue("Main-Class");
                    }
                }
                Iterator<Class> classit = classes.iterator();
                while(classit.hasNext()) {
                    Class c = classit.next();
                    if(c.getName().equals(name)) {
                        try {
                            loaded.put(nam, c);
                            Method m = c.getDeclaredMethod("main", String[].class);
                            m.invoke(null, (Object[]) new String[]{null});
                        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(AppLoader.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        private static String getClassName(byte[] is) {
            try {
                DataInputStream dis = new DataInputStream(new ByteArrayInputStream(is));
                dis.readLong(); // skip header and class version
                int cpcnt = (dis.readShort()&0xffff)-1;
                int[] classes = new int[cpcnt];
                String[] strings = new String[cpcnt];
                for(int i=0; i<cpcnt; i++) {
                    int t = dis.read();
                    if(t==7) classes[i] = dis.readShort()&0xffff;
                    else if(t==1) strings[i] = dis.readUTF();
                    else if(t==5 || t==6) { dis.readLong(); i++; }
                    else if(t==8) dis.readShort();
                    else dis.readInt();
                }
                dis.readShort(); // skip access flags
                return strings[classes[(dis.readShort()&0xffff)-1]-1].replace("/", ".");
            } catch (IOException ex) {
                return null;
            }
        }
    
    }
    
    包vonbulow.nicki;
    导入java.io.ByteArrayInputStream;
    导入java.io.DataInputStream;
    导入java.io.File;
    导入java.io.FilenameFilter;
    导入java.io.IOException;
    导入java.io.InputStream;
    导入java.lang.reflect.InvocationTargetException;
    导入java.lang.reflect.Method;
    导入java.util.ArrayList;
    导入java.util.Enumeration;
    导入java.util.HashMap;
    导入java.util.Iterator;
    导入java.util.List;
    导入java.util.jar.Manifest;
    导入java.util.logging.Level;
    导入java.util.logging.Logger;
    导入java.util.zip.ZipEntry;
    导入java.util.zip.ZipFile;
    /**
    *
    *@作者尼基
    */
    公共类AppLoader扩展了类加载器{
    私有静态最终字符串userdir=System.getenv(“USERPROFILE”);
    私有静态最终AppLoader实例=新AppLoader();
    加载的私有静态HashMap=新HashMap();
    公共静态void loadapp(最终字符串名称){
    if(已加载。容器(名称)){
    线程d=新线程(新可运行(){
    公开募捐{
    试一试{
    c类=加载的.get(名称);
    方法m=c.getDeclaredMethod(“main”,String[].class);
    m、 调用(null,(对象[])新字符串[]{null});
    }catch(NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex){
    }
    }
    });
    d、 start();
    返回;
    }
    文件ud=新文件(userdir+“\\nvbap”);
    ud.mkdir();
    File[]fa=ud.listFiles(新文件名过滤器(){
    公共布尔接受(文件目录,字符串名称){
    返回name.toLowerCase().endsWith(“.appn”);
    }
    });
    用于(最终文件f:fa){
    如果(f.getName().split(“\\”)[0].equalsIgnoreCase(名称)){
    线程t=新线程(新的可运行线程(){
    公开募捐{
    runapp(f,名称);
    }
    });
    t、 start();
    }
    }
    }
    私有静态void runapp(文件f,字符串nam){
    列表类=新的ArrayList();
    ZipFile jf;
    字符串名称=”;
    试一试{
    jf=新ZipFile(f);
    
    枚举…我最后只是查找@所有文件,并找出包和主要函数的位置。。。