请教有关main method的问题
请问我可否在自己编的java程序中调用其他class中的main函数,比如:
public class Emulator{ //example which has a main method
public static void main(String args[]){
if(!checkVMVersion())
System.exit(1);
sw = new SplashWindow(null);
(new Main()).run(args);
}
....
}
---------------------
import Emulator;
public class myprogram{ //my program which wants to invoke Emulator.main
String s = "-Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin";
Emulator.main(s); //?????
...
}
谢谢各位建议
Yu
问题点数:0、回复次数:15Top
1 楼lhj(努力加油)回复于 2005-02-02 13:40:33 得分 0
String s = "-Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin";
String[] args = new String[1];
args[0] = s;
Emulator.main(args); //这样可以Top
2 楼drugon(更高,更远,更强)回复于 2005-02-02 13:43:46 得分 0
不行吧!Top
3 楼zjpangxie(专用马甲)回复于 2005-02-02 13:48:42 得分 0
可以,但不知道你为什么这么做 -_-Top
4 楼xhyjiang()回复于 2005-02-02 14:00:51 得分 0
我这么做实在有苦衷,想不到其他办法,大家有空帮忙看看我之前发的帖子
http://community.csdn.net/Expert/topic/3769/3769180.xml?temp=.6164057
这个帖子的Emulator class就是上述帖子里的com.sun.kvem.toolbar.Main class,下面是我反编译Main.class后部分代码:
------------------------------------
package com.sun.kvem.toolbar;
import com.sun.kvem.environment.JavaVersionTester;
import com.sun.kvem.util.ToolkitResources;
import com.sun.kvem.util.WindowUtils;
import java.io.PrintStream;
import java.util.Properties;
import java.util.Vector;
import javax.swing.JOptionPane;
public class Main
{
/* member class not found */
class SplashWindow {}
public Main()
{
}
public int run(String as[])
{
as = processArgs(as, 0);
WindowUtils.setLookAndFeel();
MainWindow mainwindow = new MainWindow();
mainwindow.run();
sw.setVisible(false);
sw.dispose();
return 0;
}
public static boolean checkVMVersion()
{ ...
}
public static void main(String args[])
{
if(!checkVMVersion())
System.exit(1);
sw = new SplashWindow(null);
(new Main()).run(args);
}
private static String[] processArgs(String as[], int i)
{
Vector vector = new Vector();
for(int j = i; j < as.length; j++)
{
String s = as[j];
if(s.startsWith("-D") && s.indexOf("=") != -1)
{
String s1 = s.substring(2);
int k = s1.indexOf("=");
String s2 = s1.substring(0, k);
String s3 = s1.substring(k + 1);
System.getProperties().put(s2, s3);
} else
{
vector.add(s);
}
}
String as1[] = new String[vector.size()];
vector.copyInto(as1);
return as1;
}
private static SplashWindow sw;
}
-------------------------------
Top
5 楼dyhml(VirusCamp)回复于 2005-02-02 14:07:47 得分 0
参数不对,那是给jvm的参数,不是给main的,main不会认.
java -Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22\bin Emulator arg1 arg2 arg3
只有Emulator之后的参数才是main的参数.Top
6 楼xhyjiang()回复于 2005-02-02 14:17:43 得分 0
啊???这么说-Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22\bin 参数不可能从程序里传递了?Top
7 楼xhyjiang()回复于 2005-02-02 14:21:39 得分 0
为了说明清楚,我把之前的帖子再贴一次,谢谢各位
我是J2ME的新手,现在学校从事软件测试的研究,想用一种测试工具(TTCN-3)测试MIDlet程序,测试工具需要被测程序(MIDlet)能够运行在其测试环境中,但我想MIDlet程序不能独立在emulator之外运行(需要KVM支持),所以我想是否可以自己写程序调用Emulator运行,然后再装载MIDlet程序进行测试。目前Nokia、Motorola和Sun等公司提供的emulator都是用Java写的,都提供了很多.jar库文件,可否通过打开库文件,搞清楚 “启动emulator”时调用的库文件的规律,对其二次编程,将emulator嵌入自己的程序中调用。
比如说:运行SUN的WTK22/bin中ktoolbar.bat可以启动J2ME Wireless Toolkits 2.2. ktoolbar.bat内容如下:
C:\J2SDK1~1.2_0\bin\java.exe -Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin -Dsun.java2d.ddlock=true -Dsun.java2d.gdiblit=false -cp C:\WTK22/wtklib/kenv.zip;C:\WTK22/wtklib/ktools.zip;C:\WTK22/bin/JadTool.jar;C:\WTK22/bin/MEKeyTool.jar;C:\WTK22/wtklib/customjmf.jar;C:\WTK22/lib/j2me-ws.jar;C:\WTK22/bin/schema2beansdev.jar;C:\WTK22/bin/j2me_sg_ri.jar;C:\WTK22/bin/jaxrpc-impl.jar;C:\WTK22/bin/jaxrpc-api.jar;C:\WTK22/bin/jaxrpc-spi.jar;C:\WTK22/bin/activation.jar;C:\WTK22/bin/mail.jar;C:\WTK22/bin/saaj-api.jar;C:\WTK22/bin/saaj-impl.jar;C:\WTK22/bin/xsdlib.jar com.sun.kvem.toolbar.Main
将com.sun.kvem.toolbar.Main.class 引用到另一个java程序中,再将所有上述jar库文件import到程序中,这样是否可以将emulator运行起来?
另外,-Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin -Dsun.java2d.ddlock=true -Dsun.java2d.gdiblit=false 可否简单地看作是com.sun.kvem.toolbar.Main.class 的main的输入参数?
请问各位,上述方法从技术角度上讲,难度和可行性有多大?谢谢各位的建议
注:我并非想盗版其他公司的emulator的版权,只是想构建个测试J2ME的测试平台,用于学术研究。
XHYJ
Top
8 楼xhyjiang()回复于 2005-02-02 14:28:16 得分 0
---------我的源码-------------
import com.sun.kvem.toolbar.Main;
class emulator {
public static void main(String[] args) {
String s = "-Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin";
String[] args = new String[1];
args[0] = s;
Main.main(args);
}
}
--------------------编译出错信息--------------------
C:\myprj\test3\emulator.java:5: illegal escape character
String s = "-Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin";
^
C:\myprj\test3\emulator.java:5: illegal escape character
String s = "-Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin";
^
---------修改后源码-----------
import com.sun.kvem.toolbar.Main;
class emulator {
public static void main(String[] args) {
String s = "-Dkvem.home";
String[] args = new String[1];
args[0] = s;
Main.main(args);
}
}
---------编译出错信息----------
C:\myprj\test3\emulator.java:6: args is already defined in main(java.lang.String[])
String[] args = new String[1];
Top
9 楼mu_x(阿木)回复于 2005-02-02 15:37:34 得分 0
可以不过你写得有点问题。变量声明重复了。
import com.sun.kvem.toolbar.Main;
class emulator {
public static void main(String[] args) {
String s = "-Dkvem.home";
String[] as = new String[1];
as[0] = s;
Main.main(as);
}
}
Top
10 楼xhyjiang()回复于 2005-02-02 17:53:20 得分 0
谢谢 mu_x(阿木) ,好像可以编译通过了,但是当我将string换回原来的"-Dkvem.home=C:\WTK22",就出现如下编译错误:
---------我的源码-------------
import com.sun.kvem.toolbar.Main;
class emulator {
public static void main(String[] args) {
String s = "-Dkvem.home=C:\WTK22";
String[] ar = new String[1];
ar[0] = s;
Main.main(ar);
}
}
---------编译出错信息----------
C:\myprj\test3\emulator.java:5: illegal escape character
String s = "-Dkvem.home=C:\WTK22";
^
1 error
Top
11 楼xhyjiang()回复于 2005-02-02 17:58:25 得分 0
好像java不认识 \
各位有否类似经历?Top
12 楼mu_x(阿木)回复于 2005-02-02 18:24:13 得分 0
\是转意符,想输入\用\\。
String s = "-Dkvem.home=C:\\WTK22";Top
13 楼mu_x(阿木)回复于 2005-02-02 18:26:11 得分 0
建议先学习一下java基础,你这个程序有很多毛病。Top
14 楼xhyjiang()回复于 2005-02-02 18:52:04 得分 0
illegal escape character 编译错误已解决,谢谢!但还是出现 You must define the system property "kvem.home" 错误。
我确信已经将-Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin -Dsun.java2d.ddlock=true -Dsun.java2d.gdiblit=false 传递给了com.sun.kvem.toolbar.Main 的main函数,而且import了所有的jar文件。请问各位:用java命令行执行中 -Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin -Dsun.java2d.ddlock=true -Dsun.java2d.gdiblit=false 这些参数是传递给JVM的,还是传递给com.sun.kvem.toolbar.Main的main method的?
C:\J2SDK1~1.2_0\bin\java.exe -Dkvem.home=C:\WTK22 -Djava.library.path=C:\WTK22/bin -Dsun.java2d.ddlock=true -Dsun.java2d.gdiblit=false -cp C:\WTK22/wtklib/kenv.zip;C:\WTK22/wtklib/ktools.zip com.sun.kvem.toolbar.Main
----------我的源码-----------
import com.sun.kvem.toolbar.Main;
import java.io.*;
class emulator {
public static void main(String[] args) {
String thisLine;
try {
BufferedReader in = new BufferedReader(new FileReader("property.txt"));
while ((thisLine = in.readLine()) != null) {
System.out.println(thisLine);
String[] ar = new String[1];
ar[0] = thisLine;
Main.main(ar);
}
}
catch (IOException e) {
System.err.println("Error: " + e);
}
}
}
Top
15 楼mu_x(阿木)回复于 2005-02-02 19:06:05 得分 0
这个好像是环境变量之类的东东,不太清楚。Top




