2008-05-18

j2se工程中有多个main()方法

关键字: java j2se main
[color=cyan] 学习java以来,都是按照书上的一些例子,做一些练习。写的东西都是按照书上说的思路,所以很少发现工程方面的问题。
最近在做一个网站的维护,我发现他们的源码里,很多的类都写了main()方法。这些类的一个特点都是在工程启动的时候就需要加载的,而且main()方法的作用也差不多是执行一下当前类的构造函数。
按照自己的理解,一个工程一般只有一个main()方法,没有必要写多个主方法。但由于代码是高人所写,所以让我觉得很不好理解的。希望知道的朋友帮忙指点哈子。
[/color]
评论
wanwok 2008-05-22
现在我也觉得应该是做测试做的.
魔力猫咪 2008-05-20
好像是给类做初始化。不过怎么调用这个实例呢?实例变量是Main的临时变量。有没有调用Main的代码?
wanwok 2008-05-20
先贴一个吧.要不然把贴子拉的太长了
wanwok 2008-05-20
public class GetRealData extends Thread {
private DatagramSocket datasocket=null;//udp socket 对象
private Vector vectStore=null;//未保存的实时数据Vector
private Vector vectProcess=null;//未处理的实时数据Vector

private RunLog runlog=new RunLog();
private LogInfo loginfo=new LogInfo("RealAnalyze");

//构造函数
public GetRealData(Vector vctStore,Vector vctProcess) {
this.vectStore=vctStore;
this.vectProcess=vctProcess;
init();
}
public static void main(String[] args) {
Vector vect=new Vector(10);
Vector vect1=new Vector(10);
GetRealData getRealData1 = new GetRealData(vect,vect1);
}

//线程主程序
public void run(){
//upd 数据包
DatagramPacket p = null;

//保存实时数据
byte[] bt=new byte[4096];

//初始化upd 包的缓冲区
try {
byte[] buf = new byte[datasocket.getReceiveBufferSize()];
p = new DatagramPacket(buf, buf.length);
}
catch (SocketException ex1) {
loginfo.setFatal("getrealData 初始化socket数据时发生SocketException错误"+ex1.getMessage());
}
// RandomAccessFile fl=null;
// try {
// fl = new RandomAccessFile("c://test1.txt","rwd");
// }
// catch (Exception ex2) {
// }
//保存数据的长度
// System.out.println("start");
int datleng=0;
//变量
int i=0;
while(true){
try {
//接收数据包
// System.out.println("start1");
datasocket.receive(p);
//System.out.println("start2");
//得到udp数据包
bt=p.getData();
//得到udp数据包长度
datleng=p.getLength();
//把接收到的数据前面为0的数据去掉
for(i=0;i<datleng;i++){
if(bt[i]>0) break;
}

vectProcess.add(new String(bt,i,datleng-i,"gb2312"));
try {
loginfo.setDebug(new String(bt, i, datleng - i, "gb2312"));
}
catch (UnsupportedEncodingException ex3) {
}
}
catch (IOException ex) {
loginfo.setFatal("接收socket时发生IOException错误:"+ex.getMessage());
}
catch(Exception ex){
loginfo.setFatal("接收socket时发生不明错误:" +
ex.getMessage());
}

//等待
try {
sleep(2);
}
catch (InterruptedException ex2) {
}
}
}


//初始化udp侦听,端口号
private boolean init(){
try {
int iport=getPort();
if(iport==0){
loginfo.setFatal("取UDP侦听端口号出错!");
return false;
}
//设置端口号
datasocket = new DatagramSocket(iport);
//设置缓冲池
datasocket.setReceiveBufferSize(4096);
}
catch (SocketException ex) {
loginfo.setFatal("初始化socket时发生SocketException错误:" + ex.getMessage());
return false;
}
return true;
}

//从配置文件中读取端口号
private int getPort(){
try {
SAXBuilder sb = new SAXBuilder();
Document doc = null;
// doc = sb.build(getClass().getResourceAsStream("config/realconf.xml"));
doc = sb.build(new FileReader("realconf.xml"));
Element el = doc.getRootElement();
if (el.getName().compareToIgnoreCase("realconf") != 0) {
return 0;
}
List lst = el.getChildren();
for (int i = 0; i < lst.size(); i++) {
el = (Element) lst.get(i);
if (el.getName().compareToIgnoreCase("reallisten") == 0) {
Element portel = el.getChild("port");
return Integer.parseInt(portel.getText() == null?"0":
portel.getText());
}
}
}
catch (JDOMException ex) {
loginfo.setError("取UDP实时数据端口时出FileNotFoundException错:"+ex.getMessage());
return 0;
}
catch(IOException ex){
loginfo.setError("取UDP实时数据端口时出IOException错:"+ex.getMessage());
return 0;
}
return 0;
}
}
jiyanliang 2008-05-20
可以把代码贴出来看看阿,看了代码大家不就都清楚了吗。
wanwok 2008-05-20
不是网站.我说的不够清楚.这是一个单独辅助程序,主要作用是过滤数据,然后插入数据中.
xiwa 2008-05-20
WEB工程吗? 我没见过服务器启动时会去调你写的main方法。。。 你也不可能自己去调吧? 有可能是做模块测试用的吧。
kayoo 2008-05-19
想当初 为了测试 我也干过这种事啊--在类里写main方法
魔力猫咪 2008-05-19
其实最主要的还是看他在Main里写了什么。一般情况下Java由一个指定的类的Main作为起点。不过网站程序中所有的程序由容器管理,main就不用写了。
如果你看到的这个程序是把Main作为一个初始化自身对象的话,应该是一个不好的写法。对象的生命周期最好根据需求由服务器容器或者IOC容器管理,至不济自己写个工厂类处理。靠每个类的Main方法处理,应该是个反模式。
wanwok 2008-05-19
怎么就没这个说话呢,是我说的大家都不懂?
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

wanwok
搜索本博客
博客分类
最近加入圈子
最新评论