1. 程式人生 > >系統分析---入門(如何確定java應用的入口)

系統分析---入門(如何確定java應用的入口)

一、場景

A拿到一個java的開源專案(如eclipse專案),此開源專案可以啟動,並且已經拿到了該專案的原始碼,小A想對這個開源專案進行一次系統的學習。

二、問題:

這時候,小A遇到了一個問題,如何確定該專案的入口?

三、技巧:JPSjstack應用

如果是一般的web應用還好說,我們可以不關心應用的入口,但現在是eclipse,所以能確定其程式的主入口對於分析該程式很有幫助。

那麼如何確定其入口呢。由於此專案是java專案,我們都知道java程式的入口方法是main方法。可以以此作為突破口,從執行緒棧中找到main對應的執行緒,不就找到該程式的入口了嗎。

四、實踐

1JPS確定該程序的

ID

首先啟動該程式(eclipse),然後使用jps確定該程序的ID:

C:\Users\Administrator>JPS

4232

2、使用jstack匯出執行緒的棧資訊

C:\Users\Administrator>jstack 4232 > threadDump.log

3、檢視threadDump.log

"main" prio=6 tid=0x020a9800 nid=0xdb4 runnable [0x0012f000]
   java.lang.Thread.State: RUNNABLE
at org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method)
at org.eclipse.swt.widgets.Display.sleep(Display.java:4652)
at org.eclipse.ui.application.WorkbenchAdvisor.eventLoopIdle(WorkbenchAdvisor.java:364)
at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.eventLoopIdle(IDEWorkbenchAdvisor.java:917)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2702)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499)
at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
at org.eclipse.equinox.launcher.Main.run(Main.java:1410)

找到main執行緒,注意最後一句

at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
由此可以確定eclipse的程式入口,好了,開始你的eclipse原始碼之旅吧