锁定老帖子 主题:j2se工程中有多个main()方法
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-18
[color=cyan] 学习java以来,都是按照书上的一些例子,做一些练习。写的东西都是按照书上说的思路,所以很少发现工程方面的问题。
最近在做一个网站的维护,我发现他们的源码里,很多的类都写了main()方法。这些类的一个特点都是在工程启动的时候就需要加载的,而且main()方法的作用也差不多是执行一下当前类的构造函数。 按照自己的理解,一个工程一般只有一个main()方法,没有必要写多个主方法。但由于代码是高人所写,所以让我觉得很不好理解的。希望知道的朋友帮忙指点哈子。[/color] 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-05-19
怎么就没这个说话呢,是我说的大家都不懂?
|
|
返回顶楼 | |
发表时间:2008-05-19
其实最主要的还是看他在Main里写了什么。一般情况下Java由一个指定的类的Main作为起点。不过网站程序中所有的程序由容器管理,main就不用写了。
如果你看到的这个程序是把Main作为一个初始化自身对象的话,应该是一个不好的写法。对象的生命周期最好根据需求由服务器容器或者IOC容器管理,至不济自己写个工厂类处理。靠每个类的Main方法处理,应该是个反模式。 |
|
返回顶楼 | |
发表时间:2008-05-19
想当初 为了测试 我也干过这种事啊--在类里写main方法
|
|
返回顶楼 | |
发表时间:2008-05-20
WEB工程吗? 我没见过服务器启动时会去调你写的main方法。。。 你也不可能自己去调吧? 有可能是做模块测试用的吧。
|
|
返回顶楼 | |
发表时间:2008-05-20
不是网站.我说的不够清楚.这是一个单独辅助程序,主要作用是过滤数据,然后插入数据中.
|
|
返回顶楼 | |
发表时间:2008-05-20
可以把代码贴出来看看阿,看了代码大家不就都清楚了吗。
|
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2008-05-20
先贴一个吧.要不然把贴子拉的太长了
|
|
返回顶楼 | |
发表时间:2008-05-20
好像是给类做初始化。不过怎么调用这个实例呢?实例变量是Main的临时变量。有没有调用Main的代码?
|
|
返回顶楼 | |