编译和执行java源代码而不知道主方法在哪里?
我面临以下问题: 我将收到一个或多个.java文件。其思想是使编译和执行过程自动化编译和执行java源代码而不知道主方法在哪里?,java,compilation,Java,Compilation,我面临以下问题: 我将收到一个或多个.java文件。其思想是使编译和执行过程自动化 我没有编写或查看收到的.java源文件 在多个目录中可能有一个或多个文件 所有这些都是在linux(Debian/CentOS)下完成的 下面是一个例子: 收到2份文件: SomeFile.java和SomeOtherFile.java(这一个有静态公共void main(字符串args[]){}方法,但我不知道!) 进程将拾取文件并以以下方式进行编译: javac-编码UTF-8-源路径-d.*。java
- 收到2份文件:
- SomeFile.java和SomeOtherFile.java(这一个有静态公共void main(字符串args[]){}方法,但我不知道!)
- 进程将拾取文件并以以下方式进行编译: javac-编码UTF-8-源路径-d.*。java
java packageName.SomeOtherFile
有很多方法:
我以前写过这样的东西:
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);
枚举…我最后只是查找@所有文件,并找出包和主要函数的位置。。。