中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識庫 > 體驗Java 1.5中面向(AOP)編程

體驗Java 1.5中面向(AOP)編程

熱門標簽:商丘百應電話機器人有沒有效果 淮南騰訊地圖標注 地圖標注人員兼職 開封便宜外呼系統報價 黃石智能營銷電銷機器人效果 騰訊地圖標注商戶改名注冊入駐 漯河辦理400電話 電話機器人的特色和創新 怎樣把地圖標注出來
對于一個能夠訪問源代碼的經驗豐富的Java開發人員來說,任何程序都可以被看作是博物館里透明的模型。類似線程轉儲(dump)、方法調用跟蹤、斷點、切面(profiling)統計表等工具可以讓我們了解程序目前正在執行什么操作、剛才做了什么操作、未來將做什么操作。但是在產品環境中情況就沒有那么明顯了,這些工具一般是不能夠使用的,或最多只能由受過訓練的開發者使用。支持團隊和最終用戶也需要知道在某個時刻應用程序正在執行什么操作。

  為了填補這個空缺,我們已經發明了一些簡單的替代品,例如日志文件(典型情況下用于服務器處理)和狀態條(用于GUI應用程序)。但是,由于這些工具只能捕捉和報告可用信息的一個很小的子集,并且通常必須把這些信息用容易理解的方式表現出來,所以程序員趨向于把它們明確地編寫到應用程序中。而這些代碼會纏繞著應用程序的業務邏輯,當開發者試圖調試或了解核心功能的時候,他們必須"圍繞這些代碼工作",而且還要記得功能發生改變后更新這些代碼。我們希望實現的真正功能是把狀態報告集中在某個位置,把單個狀態消息作為元數據(metadata)來管理。

  在本文中我將考慮使用嵌入GUI應用程序中的狀態條組件的情形。我將介紹多種實現這種狀態報告的不同方法,從傳統的硬編碼習慣開始。隨后我會介紹Java 1.5的大量新特性,包括注解(annotation)和運行時字節碼重構(instrumentation)。

  狀態管理器(StatusManager)

  我的主要目標是建立一個可以嵌入GUI應用程序的JStatusBar Swing組件。圖1顯示了一個簡單的Jframe中狀態條的樣式。
  
  
圖1.我們動態生成的狀態條

  由于我不希望直接在業務邏輯中引用任何GUI組件,我將建立一個StatusManager(狀態管理器)來充當狀態更新的入口點。實際的通知會被委托給StatusState對象,因此以后可以擴展它以支持多個并發的線程。圖2顯示了這種安排。
  

圖2. StatusManager和JstatusBar

  現在我必須編寫代碼調用StatusManager的方法來報告應用程序的進程。典型情況下,這些方法調用都分散地貫穿于try-finally代碼塊中,通常每個方法一個調用。   

  public void connectToDB (String url) {
   StatusManager.push("Connecting to database");
   try {
    ...
   } finally {
    StatusManager.pop();
   }
  }

  這些代碼實現了我們所需要功能,但是在代碼庫中數十次、甚至于數百次地復制這些代碼之后,它看起來就有些混亂了。此外,如果我們希望用一些其它的方式訪問這些消息該怎么辦呢?在本文的后面部分中,我將定義一個用戶友好的異常處理程序,它共享了相同的消息。問題是我把狀態消息隱藏在方法的實現之中了,而沒有把消息放在消息所屬的接口中。

  面向屬性編程

  我真正想實現的操作是把對StatusManager的引用都放到代碼外面的某個地方,并簡單地用我們的消息標記這個方法。接著我可以使用代碼生成(code-generation)或運行時反省(introspection)來執行真正的工作。XDoclet項目把這種方法歸納為面向屬性編程(Attribute-Oriented Programming),它還提供了一個框架組件,可以把自定義的類似Javadoc的標記轉換到源代碼之中。

  但是,JSR-175包含了這樣的內容,Java 1.5為了包含真實代碼中的這些屬性提供了一種結構化程度更高的格式。這些屬性被稱為"注解(annotations)",我們可以使用它們為類、方法、字段或變量定義提供元數據。它們必須被顯式聲明,并提供一組可以包含任意常量值(包括原語、字符串、枚舉和類)的名稱-值對(name-value pair)。

  注解(Annotations)

  為了處理狀態消息,我希望定義一個包含字符串值的新注解。注解的定義非常類似接口的定義,但是它用@interface關鍵字代替了interface,并且只支持方法(盡管它們的功能更像字段):   

  public @interface Status {
   String value();
  }

  與接口類似,我把@interface放入一個叫做Status.java的文件中,并把它導入到任何需要引用它的文件中。

  對我們的字段來說,value可能是個奇怪的名稱。類似message的名稱可能更適合;但是,value對于Java來說具有特殊的意義。它允許我們使用@Status("...")代替@Status(value="...")來定義注解,這明顯更加簡捷。

  我現在可以使用下面的代碼定義自己的方法:

  @Status("Connecting to database")
  public void connectToDB (String url) {
  ...
  }

  請注意,我們在編譯這段代碼的時候必須使用-source 1.5選項。如果你使用Ant而不是直接使用javac命令行建立應用程序,那么你需要使用Ant 1.6.1以上版本。

  作為類、方法、字段和變量的補充,注解也可以用于為其它的注解提供元數據。特別地,Java引入了少量注解,你可以使用這些注解來定制你自己的注解的工作方式。我們用下面的代碼重新定義自己的注解:

  @Target(ElementType.METHOD)
  @Retention(RetentionPolicy.SOURCE)
  public @interface Status {
  String value();
  }

  @Target注解定義了@Status注解可以引用什么內容。理想情況下,我希望標記大塊的代碼,但是它的選項只有方法、字段、類、本地變量、參數和其它注解。我只對代碼感興趣,因此我選擇了METHOD(方法)。

  @Retention注解允許我們指定Java什么時候可以自主地拋棄消息。它可能是SOURCE(在編譯時拋棄)、CLASS(在類載入時拋棄)或RUNTIME(不拋棄)。我們先選擇SOURCE,但是在本文后部我們會更新它。

    重構源代碼

  現在我的消息都被編碼放入元數據中了,我必須編寫一些代碼來通知狀態監聽程序。假設在某個時候,我繼續把connectToDB方法保存源代碼控件中,但是卻沒有對StatusManager的任何引用。但是,在編譯這個類之前,我希望加入一些必要的調用。也就是說,我希望自動地插入try-finally語句和push/pop調用。

  XDoclet框架組件是一種Java源代碼生成引擎,它使用了類似上述的注解,但是把它們存儲在Java源代碼的注釋(comment)中。XDoclet生成整個Java類、配置文件或其它建立的部分的時候非常完美,但是它不支持對已有Java類的修改,而這限制了重構的有效性。作為代替,我可以使用分析工具(例如JavaCC或ANTLR,它提供了分析Java源代碼的語法基礎),但是這需要花費大量精力。

  看起來沒有什么可以用于Java代碼的源代碼重構的很好的工具。這類工具可能有市場,但是你在本文的后面部分可以看到,字節碼重構可能是一種更強大的技術。 重構字節碼

  不是重構源代碼然后編譯它,而是編譯原始的源代碼,然后重構它所產生的字節碼。這樣的操作可能比源代碼重構更容易,也可能更加復雜,而這依賴于需要的準確轉換。字節碼重構的主要優點是代碼可以在運行時被修改,不需要使用編譯器。

  盡管Java的字節碼格式相對簡單,我還是希望使用一個Java類庫來執行字節碼的分析和生成(這可以把我們與未來Java類文件格式的改變隔離開來)。我選擇了使用Jakarta的Byte Code Engineering Library(字節碼引擎類庫,BCEL),但是我還可以選用CGLIB、ASM或SERP。

  由于我將使用多種不同的方式重構字節碼,我將從聲明重構的通用接口開始。它類似于執行基于注解重構的簡單框架組件。這個框架組件基于注解,將支持類和方法的轉換,因此該接口有類似下面的定義:  

  public interface Instrumentor
  {
   public void instrumentClass (ClassGen classGen,Annotation a);
   public void instrumentMethod (ClassGen classGen,MethodGen methodGen,Annotation a);
  }

  ClassGen和MethodGen都是BCEL類,它們使用了Builder模式(pattern)。也就是說,它們為改變其它不可變的(immutable)對象、以及可變的和不可變的表現(representation)之間的轉換提供了方法。

  現在我需要為接口編寫實現,它必須用恰當的StatusManager調用更換@Status注解。前面提到,我希望把這些調用包含在try-finally代碼塊中。請注意,要達到這個目標,我們所使用的注解必須用@Retention(RetentionPolicy.CLASS)進行標記,它指示Java編譯器在編譯過程中不要拋棄注解。由于在前面我把@Status聲明為@Retention(RetentionPolicy.SOURCE)的,我必須更新它。

  在這種情況下,重構字節碼明顯比重構源代碼更復雜。其原因在于try-finally是一種僅僅存在于源代碼中的概念。Java編譯器把try-finally代碼塊轉換為一系列的try-catch代碼塊,并在每一個返回之前插入對finally代碼塊的調用。因此,為了把try-finally代碼塊添加到已有的字節碼中,我也必須執行類似的事務。

  下面是表現一個普通方法調用的字節碼,它被StatusManager更新環繞著:  

  0: ldc #2; //字符串消息
  2: invokestatic #3; //方法StatusManager.push:(LString;)V
  5: invokestatic #4; //方法 doSomething:()V
  8: invokestatic #5; //方法 StatusManager.pop:()V
  11: return

  下面是相同的方法調用,但是位于try-finally代碼塊中,因此,如果它產生了異常會調用StatusManager.pop():  

  0: ldc #2; //字符串消息
  2: invokestatic #3; //方法 StatusManager.push:(LString;)V
  5: invokestatic #4; //方法 doSomething:()V
  8: invokestatic #5; //方法 StatusManager.pop:()V
  11: goto 20
  14: astore_0
  15: invokestatic #5; //方法 StatusManager.pop:()V
  18: aload_0
  19: athrow
  20: return  

  Exception table:
  from to target type
  5 8 14 any

  14 15 14 any

  你可以發現,為了實現一個try-finally,我必須復制一些指令,并添加了幾個跳轉和異常表記錄。幸運的是,BCEL的InstructionList類使這種工作相當簡單。

  在運行時重構字節碼

  現在我擁有了一個基于注解修改類的接口和該接口的具體實現了,下一步是編寫調用它的實際框架組件。實際上我將編寫少量的框架組件,先從運行時重構所有類的框架組件開始。由于這種操作會在build過程中發生,我決定為它定義一個Ant事務。build.xml文件中的重構目標的聲明應該如下:  

  <instrument class="com.pkg.OurInstrumentor">
  <fileset dir="$(classes.dir)">
  <include name="**/*.class"/>
  </fileset>
  </instrument>

  為了實現這種事務,我必須定義一個實現org.apache.tools.ant.Task接口的類。我們的事務的屬性和子元素(sub-elements)都是通過set和add方法調用傳遞進來的。我們調用執行(execute)方法來實現事務所要執行的工作--在示例中,就是重構<fileset>中指定的類文件。 

  public class InstrumentTask extends Task {
   ...
   public void setClass (String className) { ... }
   public void addFileSet (FileSet fileSet) { ... }  

   public void execute () throws BuildException {
    Instrumentor inst = getInstrumentor();
  try {
     DirectoryScanner ds =fileSet.getDirectoryScanner(project);
     // Java 1.5 的"for" 語法
     for (String file : ds.getIncludedFiles()) {
      instrumentFile(inst, file);
     }
    } catch (Exception ex) {
     throw new BuildException(ex);
    }
   }
   ...
  }

  用于該項操作的BCEL 5.1版本有一個問題--它不支持分析注解。我可以載入正在重構的類并使用反射(reflection)查看注解。但是,如果這樣,我就不得不使用RetentionPolicy.RUNTIME來代替RetentionPolicy.CLASS。我還必須在這些類中執行一些靜態的初始化,而這些操作可能載入本地類庫或引入其它的依賴關系。幸運的是,BCEL提供了一種插件(plugin)機制,它允許客戶端分析字節碼屬性。我編寫了自己的AttributeReader的實現(implementation),在出現注解的時候,它知道如何分析插入字節碼中的RuntimeVisibleAnnotations和RuntimeInvisibleAnnotations屬性。BCEL未來的版本應該會包含這種功能而不是作為插件提供。

  編譯時刻的字節碼重構方法顯示在示例代碼的code/02_compiletime目錄中。

  但是這種方法有很多缺陷。首先,我必須給建立過程增加額外的步驟。我不能基于命令行設置或其它編譯時沒有提供的信息來決定打開或關閉重構操作。如果重構的或沒有重構的代碼需要同時在產品環境中運行,那么就必須建立兩個單獨的.jars文件,而且還必須決定使用哪一個。

    在類載入時重構字節碼

  更好的方法可能是延遲字節碼重構操作,直到字節碼被載入的時候才進行重構。使用這種方法的時候,重構的字節碼不用保存起來。我們的應用程序啟動時刻的性能可能會受到影響,但是你卻可以基于自己的系統屬性或運行時配置數據來控制進行什么操作。

  Java 1.5之前,我們使用定制的類載入程序可能實現這種類文件維護操作。但是Java 1.5中新增加的java.lang.instrument程序包提供了少數附加的工具。特別地,它定義了ClassFileTransformer的概念,在標準的載入過程中我們可以使用它來重構一個類。

  為了在適當的時候(在載入任何類之前)注冊ClassFileTransformer,我需要定義一個premain方法。Java在載入主類(main class)之前將調用這個方法,并且它傳遞進來對Instrumentation對象的引用。我還必須給命令行增加-javaagent參數選項,告訴Java我們的premain方法的信息。這個參數選項把我們的agent class(代理類,它包含了premain方法)的全名和任意字符串作為參數。在例子中我們把Instrumentor類的全名作為參數(它必須在同一行之中):

  -javaagent:boxpeeking.instrument.InstrumentorAdaptor=
  boxpeeking.status.instrument.StatusInstrumentor

  現在我已經安排了一個回調(callback),它在載入任何含有注解的類之前都會發生,并且我擁有Instrumentation對象的引用,可以注冊我們的ClassFileTransformer了:

  public static void premain (String className,
  Instrumentation i)
  throws ClassNotFoundException,
  InstantiationException,
  IllegalAccessException
  {
   Class instClass = Class.forName(className);
   Instrumentor inst = (Instrumentor)instClass.newInstance();
   i.addTransformer(new InstrumentorAdaptor(inst));
  }

  我們在此處注冊的適配器將充當上面給出的Instrumentor接口和Java的ClassFileTransformer接口之間的橋梁。   

  public class InstrumentorAdaptor
  implements ClassFileTransformer
  {
   public byte[] transform (ClassLoader cl,String className,Class classBeingRedefined,
  ProtectionDomain protectionDomain,byte[] classfileBuffer)
   {
    try {
     ClassParser cp =new ClassParser(new ByteArrayInputStream(classfileBuffer),className + ".java");
     JavaClass jc = cp.parse();
   ClassGen cg = new ClassGen(jc);
   for (Annotation an : getAnnotations(jc.getAttributes())) {
      instrumentor.instrumentClass(cg, an);
     }
   for (org.apache.bcel.classfile.Method m : cg.getMethods()) {
      for (Annotation an : getAnnotations(m.getAttributes())) {
       ConstantPoolGen cpg =cg.getConstantPool();
       MethodGen mg =new MethodGen(m, className, cpg);
       instrumentor.instrumentMethod(cg, mg, an);
       mg.setMaxStack();
       mg.setMaxLocals();
       cg.replaceMethod(m, mg.getMethod());
      }
     }
     JavaClass jcNew = cg.getJavaClass();
     return jcNew.getBytes();
    } catch (Exception ex) {
     throw new RuntimeException("instrumenting " + className, ex);
    }
   }
   ...
  }

  這種在啟動時重構字節碼的方法位于在示例的/code/03_startup目錄中。

  異常的處理

  文章前面提到,我希望編寫附加的代碼使用不同目的的@Status注解。我們來考慮一下一些額外的需求:我們的應用程序必須捕捉所有的未處理異常并把它們顯示給用戶。但是,我們不是提供Java堆棧跟蹤,而是顯示擁有@Status注解的方法,而且還不應該顯示任何代碼(類或方法的名稱或行號等等)。

  例如,考慮下面的堆棧跟蹤信息:

  java.lang.RuntimeException: Could not load data for symbol IBM
  at boxpeeking.code.YourCode.loadData(Unknown Source)
  at boxpeeking.code.YourCode.go(Unknown Source)
  at boxpeeking.yourcode.ui.Main+2.run(Unknown Source)
  at java.lang.Thread.run(Thread.java:566)
  Caused by: java.lang.RuntimeException: Timed out
  at boxpeeking.code.YourCode.connectToDB(Unknown Source)

  ... 更多信息

  這將導致圖1中所示的GUI彈出框,上面的例子假設你的YourCode.loadData()、YourCode.go()和YourCode.connectToDB()都含有@Status注解。請注意,異常的次序是相反的,因此用戶最先得到的是最詳細的信息。  


  
圖3.顯示在錯誤對話框中的堆棧跟蹤信息

  為了實現這些功能,我必須對已有的代碼進行稍微的修改。首先,為了確保在運行時@Status注解是可以看到的,我就必須再次更新@Retention,把它設置為@Retention(RetentionPolicy.RUNTIME)。請記住,@Retention控制著JVM什么時候拋棄注解信息。這樣的設置意味著注解不僅可以被編譯器插入字節碼中,還能夠使用新的Method.getAnnotation(Class)方法通過反射來進行訪問。

  現在我需要安排接收代碼中沒有明確處理的任何異常的通知了。在Java 1.4中,處理任何特定線程上未處理異常的最好方法是使用ThreadGroup子類并給該類型的ThreadGroup添加自己的新線程。但是Java 1.5提供了額外的功能。我可以定義UncaughtExceptionHandler接口的一個實例,并為任何特定的線程(或所有線程)注冊它。

  請注意,在例子中為特定異常注冊可能更好,但是在Java 1.5.0beta1(#4986764)中有一個bug,它使這樣操作無法進行。但是為所有線程設置一個處理程序是可以工作的,因此我就這樣操作了。

  現在我們擁有了一種截取未處理異常的方法了,并且這些異常必須被報告給用戶。在GUI應用程序中,典型情況下這樣的操作是通過彈出一個包含整個堆棧跟蹤信息或簡單消息的模式對話框來實現的。在例子中,我希望在產生異常的時候顯示一個消息,但是我希望提供堆棧的@Status描述而不是類和方法的名稱。為了實現這個目的,我簡單地在Thread的StackTraceElement數組中查詢,找到與每個框架相關的java.lang.reflect.Method對象,并查詢它的堆棧注解列表。不幸的是,它只提供了方法的名稱,沒有提供方法的特征量(signature),因此這種技術不支持名稱相同的(但@Status注解不同的)重載方法。

  實現這種方法的示例代碼可以在peekinginside-pt2.tar.gz文件的/code/04_exceptions目錄中找到。 

    取樣(Sampling)

  我現在有辦法把StackTraceElement數組轉換為@Status注解堆棧。這種操作比表明看到的更加有用。Java 1.5中的另一個新特性--線程反省(introspection)--使我們能夠從當前正在運行的線程中得到準確的StackTraceElement數組。有了這兩部分信息之后,我們就可以構造JstatusBar的另一種實現。StatusManager將不會在發生方法調用的時候接收通知,而是簡單地啟動一個附加的線程,讓它負責在正常的間隔期間抓取堆棧跟蹤信息和每個步驟的狀態。只要這個間隔期間足夠短,用戶就不會感覺到更新的延遲。

  下面使"sampler"線程背后的代碼,它跟蹤另一個線程的經過:

  class StatusSampler implements Runnable
  {
   private Thread watchThread;  

   public StatusSampler (Thread watchThread)
   {
    this.watchThread = watchThread;
   }  

   public void run ()
   {
    while (watchThread.isAlive()) {
     // 從線程中得到堆棧跟蹤信息
     StackTraceElement[] stackTrace =watchThread.getStackTrace();
     // 從堆棧跟蹤信息中提取狀態消息
     List<Status> statusList =StatusFinder.getStatus(stackTrace);
     Collections.reverse(statusList);
     // 用狀態消息建立某種狀態
     StatusState state = new StatusState();
     for (Status s : statusList) {
      String message = s.value();
      state.push(message);
     }

   // 更新當前的狀態

     StatusManager.setState(watchThread,state);

     //休眠到下一個周期

     try {
      Thread .sleep(SAMPLING_DELAY);
     } catch (InterruptedException ex) {}
    }
  //狀態復位
    StatusManager.setState(watchThread,new StatusState());
   }
  }

  與增加方法調用、手動或通過重構相比,取樣對程序的侵害性(invasive)更小。我根本不需要改變建立過程或命令行參數,或修改啟動過程。它也允許我通過調整SAMPLING_DELAY來控制占用的開銷。不幸的是,當方法調用開始或結束的時候,這種方法沒有明確的回調。除了狀態更新的延遲之外,沒有原因要求這段代碼在那個時候接收回調。但是,未來我能夠增加一些額外的代碼來跟蹤每個方法的準確的運行時。通過檢查StackTraceElement是可以精確地實現這樣的操作的。

  通過線程取樣實現JStatusBar的代碼可以在peekinginside-pt2.tar.gz文件的/code/05_sampling目錄中找到。

  在執行過程中重構字節碼

  通過把取樣的方法與重構組合在一起,我能夠形成一種最終的實現,它提供了各種方法的最佳特性。默認情況下可以使用取樣,但是應用程序的花費時間最多的方法可以被個別地進行重構。這種實現根本不會安裝ClassTransformer,但是作為代替,它會一次一個地重構方法以響應取樣過程中收集到的數據。

  為了實現這種功能,我將建立一個新類InstrumentationManager,它可以用于重構和不重構獨立的方法。它可以使用新的Instrumentation.redefineClasses方法來修改空閑的類,同時代碼則可以不間斷執行。前面部分中增加的StatusSampler線程現在有了額外的職責,它把任何自己"發現"的@Status方法添加到集合中。它將周期性地找出最壞的冒犯者并把它們提供給InstrumentationManager以供重構。這允許應用程序更加精確地跟蹤每個方法的啟動和終止時刻。

  前面提到的取樣方法的一個問題是它不能區分長時間運行的方法與在循環中多次調用的方法。由于重構會給每次方法調用增加一定的開銷,我們有必要忽略頻繁調用的方法。幸運的是,我們可以使用重構解決這個問題。除了簡單地更新StatusManager之外,我們將維護每個重構的方法被調用的次數。如果這個數值超過了某個極限(意味著維護這個方法的信息的開銷太大了),取樣線程將會永遠地取消對該方法的重構。

  理想情況下,我將把每個方法的調用數量存儲在重構過程中添加到類的新字段中。不幸的是,Java 1.5中增加的類轉換機制不允許這樣操作;它不能增加或刪除任何字段。作為代替,我將把這些信息存儲在新的CallCounter類的Method對象的靜態映射中。

  這種混合的方法可以在示例代碼的/code/06_dynamic目錄中找到。

  概括

  圖4提供了一個矩形,它顯示了我給出的例子相關的特性和代價。   


  
圖4.重構方法的分析

  你可以發現,動態的(Dynamic)方法是各種方案的良好組合。與使用重構的所有示例類似,它提供了方法開始或終止時刻的明確的回調,因此你的應用程序可以準確地跟蹤運行時并立即為用戶提供反饋信息。但是,它還能夠取消某種方法的重構(它被過于頻繁地調用),因此它不會受到其它的重構方案遇到的性能問題的影響。它沒有包含編譯時步驟,并且它沒有增加類載入過程中的額外的工作。

  未來的趨勢

  我們可以給這個項目增加大量的附件特性,使它更加適用。其中最有用的特性可能是動態的狀態信息。我們可以使用新的java.util.Formatter類把類似printf的模式替換(pattern substitution)用于@Status消息中。例如,我們的connectToDB(String url)方法中的@Status("Connecting to %s")注解可以把URL作為消息的一部分報告給用戶。

  在源代碼重構的幫助下,這可能顯得微不足道,因為我將使用的Formatter.format方法使用了可變參數(Java 1.5中增加的"魔術"功能)。重構過的版本類似下面的情形:

  public void connectToDB (String url) {
   Formatter f = new Formatter();
   String message = f.format("Connecting to %s", url);  

   StatusManager.push(message);
   try {
    ...
   } finally {
    StatusManager.pop();
   }
  }

  不幸的是,這種"魔術"功能是完全在編譯器中實現的。在字節碼中,Formatter.format把Object[]作為參數,編譯器明確地添加代碼來包裝每個原始的類型并裝配該數組。如果BCEL沒有加緊彌補,而我又需要使用字節碼重構,我將不得不重新實現這種邏輯。

  由于它只能用于重構(這種情況下方法參數是可用的)而不能用于取樣,你可能希望在啟動的時候重構這些方法,或最少使動態實現偏向于任何方法的重構,還可以在消息中使用替代模式。

  你還可以跟蹤每個重構的方法調用的啟動次數,因此你還可以更加精確地報告每個方法的運行次數。你甚至于可以保存這些次數的歷史統計數據,并使用它們形成一個真正的進度條(代替我使用的不確定的版本)。這種能力將賦予你在運行時重構某種方法的一個很好的理由,因為跟蹤任何獨立的方法的開銷都是很能很明顯的。

  你可以給進度條增加"調試"模式,它不管方法調用是否包含@Status注解,報告取樣過程中出現的所有方法調用。這對于任何希望調試死鎖或性能問題的開發者來說都是無價之寶。實際上,Java 1.5還為死鎖(deadlock)檢測提供了一個可編程的API,在應用程序鎖住的時候,我們可以使用該API把進程條變成紅色。

  本文中建立的基于注解的重構框架組件可能很有市場。一個允許字節碼在編譯時(通過Ant事務)、啟

  動時(使用ClassTransformer)和執行過程中(使用Instrumentation)進行重構的工具對于少量其它新項目來說毫無疑問地非常有價值。

  總結

  在這幾個例子中你可以看到,元數據編程(meta-programming)可能是一種非常強大的技術。報告長時間運行的操作的進程僅僅是這種技術的應用之一,而我們的JStatusBar僅僅是溝通這些信息的一種媒介。我們可以看到,Java 1.5中提供的很多新特性為元數據編程提供了增強的支持。特別地,把注解和運行時重構組合在一起為面向屬性的編程提供了真正動態的形式。我們可以進一步使用這些技術,使它的功能超越已有的框架組件(例如XDoclet提供的框架組件的功能)。 

您可能感興趣的文章:
  • java使用動態代理來實現AOP(日志記錄)的實例代碼
  • Java JDK動態代理(AOP)的實現原理與使用詳析
  • Java動態代理實現AOP
  • 十分鐘理解Java中的動態代理
  • Java中反射動態代理接口的詳解及實例
  • java實現動態代理方法淺析
  • Java動態代理的應用詳解
  • 深入理解java動態代理的兩種實現方式(JDK/Cglib)
  • Java動態代理分析及簡單實例
  • Java實現AOP面向切面編程的實例教程
  • Java動態代理和AOP應用示例

標簽:岳陽 大興安嶺 鄭州 武威 紅河 拉薩 亳州 馬鞍山

巨人網絡通訊聲明:本文標題《體驗Java 1.5中面向(AOP)編程》,本文關鍵詞  體驗,Java,1.5,中,面向,AOP,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《體驗Java 1.5中面向(AOP)編程》相關的同類信息!
  • 本頁收集關于體驗Java 1.5中面向(AOP)編程的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 德瑞机械设备有限公司| 华力重工机械有限公司| 仙游东亚机械有限公司| 东莞达机械有限公司| 金丰机械工业有限公司| 青岛海诺机械制造有限公司 | 广州机械设备有限公司| 河南永威起重机有限公司| 浙江鑫 机械有限公司| 日照钢铁轧钢有限公司| 新乡市威远机械有限公司| 龙南福鑫钢铁有限公司| 济南 重工有限公司| 无锡振华机械有限公司| 北京长空机械有限公司| 湖南汇一制药机械有限公司 | 上海申德机械有限公司| 咸阳经纬纺织机械有限公司| 河南柴油机重工有限公司| 无锡建仪仪器机械有限公司| 富江机械制造有限公司| 四川高龙机械有限公司| 万金机械配件有限公司| 玉环宝捷机械有限公司| 漳州三宝钢铁有限公司| 济宁福康机械加工有限公司| 天津起重机械有限公司| 河北输送机械有限公司| 邢台机械轧辊有限公司| 天津文洲机械有限公司| 东泰机械制造有限公司| 无锡真木机械有限公司| 重庆磐达机械有限公司| 宁波佳利来机械制造有限公司| 广州市勤达机械设备有限公司| 宁波机械配件有限公司| 义乌机械设备有限公司| 无锡双益精密机械有限公司| 河南隧通机械有限公司| 常州好迪机械有限公司| 山东博远重工有限公司| 震德塑料机械有限公司| 青岛九合重工机械有限公司| 宁波北仑机械有限公司| 北京加隆工程机械有限公司| 天津机械设备有限公司| 上海远跃制药机械有限公司| 恒昌机械制造有限公司| 马钢合肥钢铁有限公司| 泸州发展机械有限公司| 江阴长达钢铁有限公司| 宁波环海重工有限公司| 无锡开普机械有限公司| 大理大钢钢铁有限公司| 泰安重工机械有限公司| 岳阳神冈起重电磁铁有限公司 | 四川华为钢铁有限公司| 杭州驰林机械有限公司| 常州斯太尔动力机械有限公司 | 郑州市鑫宇机械制造有限公司 | 济宁金牛重工有限公司| 徐州七星机械有限公司| 福建群峰机械有限公司| 青岛液压机械有限公司| 郑州工程机械有限公司| 南京精密机械有限公司| 河南康迪机械有限公司| 宝鸡忠诚制药机械有限公司| 湘潭丰弘机械制造有限公司 | 江阴惠尔信机械有限公司| 滦南华瑞钢铁有限公司| 北京市机械施工有限公司| 新乡市起重机厂有限公司| 汇大机械制造有限公司| 温州惠利机械有限公司| 常州常矿起重机械有限公司 | 福州四兴机械有限公司| 荏原机械烟台有限公司| 宁波奥晟机械有限公司| 河北双天机械制造有限公司| 江宏机械制造有限公司| 济南 机械有限公司| 东莞奥锐机械有限公司| 广东华三行工程机械有限公司| 佛山市松可包装机械有限公司| 山东明美数控机械有限公司 | 深圳龙润彩印机械设备有限公司| 浙江为尚机械有限公司| 特雷克斯常州机械有限公司| 南兴木工机械有限公司| 浙江雷克机械工业有限公司| 昆明群泰机械有限公司| 浙江万龙机械有限公司| 丹阳荣嘉精密机械有限公司| 河南博众机械制造有限公司| 河北州科重工有限公司| 华天机械制造有限公司| 张家港海狮洗涤机械有限公司 | 友隆精密机械有限公司| 江西神起信息技术有限公司| 瑞鼎精密机械有限公司| 上海臣轩机械有限公司| 广州市市政工程机械施工有限公司| 成机械设备有限公司| 东莞市鼎祥通用机械设备有限公司| 沈阳斗山工程机械有限公司| 上海新沪机械有限公司| 山东莱芜煤矿机械有限公司| 重村钢模机械工业苏州有限公司 | 浙江四和机械有限公司| 徐州徐工基础工程机械有限公司| 江阴市永昌药化机械有限公司| 启东丰顺重工有限公司| 金泰机械制造有限公司| 濮阳市机械有限公司| 苏州捷合机械有限公司| 河南星光机械有限公司| 星精密机械有限公司| 烟台海兰德机械设备有限公司 | 湖州机械设备有限公司| 上海众星洗涤机械制造有限公司| 深圳市环球同创机械有限公司| 华夏机械设备有限公司| 江苏机械制造有限公司| 江苏长虹涂装机械有限公司| 厦门大禾机械有限公司| 工程机械设备有限公司| 友池精密机械有限公司| 上海善佳机械设备有限公司| 浙江天风塑料机械有限公司| 大连仁海重工有限公司| 远洋翔瑞机械有限公司| 南通安港机械有限公司| 大连铸鸿机械有限公司| 山东食品机械有限公司| 台州嘉瑞机械有限公司| 浙江海工机械有限公司| 辽阳腾龙钢铁有限公司| 重庆金丰机械有限公司| 上海信烨精密机械有限公司| 中泰机械设备有限公司| 河北食品机械有限公司| 青岛德固特机械制造有限公司| 成都杰瑞达工程机械有限公司| 郑州大华矿山机械有限公司| 苏州信能精密机械有限公司| 传动机械设备有限公司| 临西中伟机械有限公司| 武汉益达建设机械有限公司| 凯澄起重机械有限公司| 广州市机械有限公司| 茂名重力石化机械制造有限公司| 徐州圣邦机械有限公司| 包头吉宇钢铁有限公司| 山东 纺织机械 有限公司| 三星重工业宁波有限公司招聘| 苏州施米特机械有限公司| 西安柳工机械有限公司| 江阴市江顺机械有限公司| 广东思沃精密机械有限公司| 宿迁 机械 有限公司| 济南包装机械械有限公司| 三星重工业宁波有限公司招聘| 浙江大宇轻工机械有限公司| 上海善能机械有限公司| 聚力特机械有限公司| 昆山市众捷塑料机械有限公司| 保定金地机械有限公司| 常州宏机械有限公司| 佛山市三良机械设备有限公司| 苏州旭展机械有限公司| 芜湖 机械制造有限公司| 江阴博纬机械有限公司| 浙江劲豹机械有限公司| 上海凌鹰机械有限公司| 江门市机械有限公司| 佛山市晶菱玻璃机械有限公司| 合肥市春晖机械制造有限公司| 沧州科信环保机械有限公司| 江苏古川机械有限公司| 威海盛世机械有限公司| 维特根机械有限公司| 上海 机械 有限公司| 四川阳光机械有限公司| 江苏爱斯特机械有限公司怎么样 | 宁波美宁机械有限公司| 河北鑫晟德农业机械制造有限公司 | 郑州谷丰机械设备有限公司 | 朗威电子机械有限公司| 青岛银象机械有限公司| 宁海奇精机械有限公司| 洛阳市机械有限公司| 河南旭矿机械有限公司| 宁波正凯机械有限公司| 重庆智茂机械制造有限公司| 烟台飞达机械有限公司| 漳州南方机械有限公司| 河北展利机械有限公司| 中设(苏州)机械设备工程有限公司| 河南豫工机械有限公司| 临沂盖氏机械有限公司| 永胜机械工业有限公司| 昆山市机械有限公司| 西安筑路机械有限公司| 山东重工机械有限公司| 江苏华光双顺机械制造有限公司| 徐州迈特机械有限公司| 青岛山森机械有限公司| 金华机械 有限公司| 江苏力威机械有限公司| 杭州丰波机械有限公司| 盐城益聚达机械有限公司| 重庆智茂机械制造有限公司| 东莞市业佳精密机械有限公司| 新乡市振动机械有限公司| 青岛春风机械有限公司| 芜湖 机械 有限公司| 北京城建重工有限公司| 高臻机械机械有限公司| 德国arku机械制造有限公司| 新乡市东振机械制造有限公司| 济南焊达机械有限公司| 河北宏业机械有限公司| 顺德机械设备有限公司| 上海达和荣艺包装机械有限公司| 太仓鸿安机械有限公司| 合肥福晟机械制造有限公司| 重庆磐达机械有限公司| 德阳 机械有限公司| 上海凡贝机械有限公司| 杭州华兴机械有限公司| 江苏宏博机械制造有限公司| 唐山正丰钢铁有限公司| 台州瑞进机械有限公司| 浙江欧耀机械有限公司| 三技精密机械有限公司| 深圳市稻田包装机械有限公司| 上海宝闽钢铁有限公司| 广州市机械有限公司| 浙江大源机械有限公司| 佛山松川机械设备有限公司| 南通凯迪自动机械有限公司 | 成都松茂工程机械有限公司| 蓬莱巨涛海洋工程重工有限公司怎么样| 常州辉机械有限公司| 杭州爱科机械有限公司| 唐盛国际机械有限公司| 泸州发展机械有限公司| 佛山三技精密机械有限公司| 永裕昌机械有限公司| 江苏雨花钢铁有限公司| 扬州恒佳机械有限公司| 杭州引春机械有限公司| 济南快克数控机械有限公司| 艾沃意特机械设备制造有限公司| 中阳钢铁有限公司电话| 速技能机械有限公司| 东莞市森佳机械有限公司| 泉州市力达机械有限公司 | 无锡诺亚机械有限公司| 杭州旭众机械设备有限公司| 青岛软控重工有限公司| 江苏江佳机械有限公司| 四川青城机械有限公司| 常熟机械制造有限公司| 安丰钢铁有限公司地址| 赛柏精密机械有限公司| 昆山市众捷塑料机械有限公司| 江苏优远机械有限公司| 舟山荣德机械有限公司| 上海沪临重工有限公司| 四川晶工机械有限公司| 青岛鲁耕农业机械有限公司| 湖北襄玉机械有限公司| 厦门华峰辊压机械有限公司| 济宁天鸿机械有限公司| 广东川德机械有限公司| 苏州金韦尔机械有限公司| 南京瑞亚挤出机械制造有限公司| 吴江机械设备有限公司| 贝斯特机械有限公司| 济宁福康机械加工有限公司| 杭州龙云水利机械制造有限公司| 兖州丰业机械有限公司| 浙江上洋机械有限公司| 山东亚泰机械有限公司| 上海又高机械有限公司| 昌信机械制造有限公司| 上海大恒光学精密机械有限公司| 江苏莱宝机械制造有限公司| 辽宁春光机械有限公司| 兰州 机械 有限公司| 天津市天机液压机械有限公司| 广东思沃精密机械有限公司| 永腾弹簧机械设备有限公司| 新昌华亿机械有限公司| 郑州谷丰机械设备有限公司| 启益电器材机械有限公司招聘 | 昆山弘迪精密机械有限公司| 杭州海兴机械有限公司| 东方液压机械有限公司| 泉州泉丰机械有限公司| 青岛欣鑫数控精密机械有限公司 | 上海徽机械有限公司| 濮阳市机械有限公司| 汕头 机械有限公司| 南通恩派特机械有限公司| 广州东昻机械有限公司| 沈阳重型机械有限公司| 南京欧能机械有限公司| 苏州诚亚机械有限公司| 山西贝斯特机械制造有限公司| 昆山胜代机械有限公司| 合肥食品机械有限公司| 天津千百顺钢铁贸易有限公司| 威海祥光机械有限公司| 东莞市瑞辉机械制造有限公司 | 江苏卫东机械有限公司| 北京永创通达机械设备有限公司| 滨州 机械 有限公司| 泰安通远机械有限公司| 杭州泰尚机械有限公司| 启益电器机械有限公司| 机械进出口有限公司| 青岛德利机械有限公司| 东莞市鸿铭机械有限公司| 抚顺起亮食品有限公司| 广西 机械 有限公司| 佛山市宝索机械制造有限公司| 上海国青机械有限公司| 江苏宏光钢铁有限公司| 上海包装机械设备有限公司| 温州市日力轻工机械有限公司| 蚌埠液力机械有限公司| 东莞市华森重工有限公司 | 浙江勇力机械有限公司| 济宁青科机械有限公司| 新乡市佳盛振动机械有限公司| 新进精密机械苏州有限公司| 郑州华隆机械有限公司| 江苏金韦尔机械有限公司| 三和水工机械有限公司| 泉州金鹰机械有限公司| 山东纺织机械有限公司| 机械化工工程有限公司| 湖南润通机械制造有限公司| 江苏金鹰流体机械有限公司| 河北春耕机械制造有限公司| 芜湖汇丰机械工业有限公司| 机械化工程有限公司| 江苏迈安德食品机械有限公司| 沈阳瑞熠机械有限公司| 启英机械设备有限公司| 河南隧通机械有限公司| 上海博储机械工业有限公司| 山东荣利中石油机械有限公司 | 江阴华东机械有限公司| 云南科玛机械设备有限公司| 朗威电子机械有限公司| 南京重霸起重设备有限公司| 广州乾能机械制造有限公司 | 浙江安奇迪动力机械有限公司| 开封茂盛机械有限公司| 中山市信元铝门窗机械制造有限公司 | 郑州新水工机械有限公司| 阿尔法起重机有限公司| 南通恩派特机械有限公司| 浏阳 机械有限公司| 宏机械铸造有限公司| 乐清市机械有限公司| 天津国际机械有限公司| 河南机械设备制造有限公司| 起航中文小说有限公司| 上海舜诺机械有限公司| 广西美鹏机械设备有限公司| 重庆国杰工程机械有限公司| 藏不起服饰有限公司| 贵阳长乐钢铁有限公司| 烟台山一机械有限公司| 阳宏机械制造有限公司| 浙江金驰机械有限公司| 安微博达重工有限公司| 沈阳六和机械有限公司| 青岛永正化工机械有限公司| 上海中造机械有限公司| 东营 机械制造 有限公司| 浩博机械制造有限公司| 大连世达重工有限公司| 江山重工机械有限公司| 江苏聚丰园林机械有限公司| 东莞启益电器机械有限公司| 桐乡合德机械有限公司| 广东华鼎机械有限公司| 新世纪机械有限公司| 威海远兴机械有限公司| 马钢合肥钢铁有限公司| 青岛云龙纺织机械有限公司| 上海液压机械有限公司| 固耐重工苏州有限公司| 江阴锦澄钢铁有限公司| 上海普顺机械电器制造有限公司| 安阳嘉和机械有限公司| 江阴华西钢铁有限公司| 国义特种钢铁有限公司| 苏州市大华精密机械有限公司| 青岛雷沃工程机械有限公司 | 莱州华汽机械有限公司| 广州汇亿机械有限公司| 宁波机械设备有限公司| 首钢东华机械有限公司| 浙江杰豹机械有限公司| 重庆海迅机械制造有限公司| 深圳市创世纪机械有限公司| 安徽富鑫钢铁有限公司| 无锡通灵机械有限公司| 柳州富达机械有限公司| 宁波思进机械有限公司| 安徽鸿泰钢铁有限公司| 济南梓鑫机械有限公司| 东莞市欧西曼机械设备有限公司| 昆山美和机械有限公司| 甘肃机械化建设工程有限公司| 济南闽源钢铁有限公司| 杭州红磊机械有限公司| 河北普阳钢铁有限公司| 山东金大丰机械有限公司| 浙江乐江机械有限公司| 邯郸纺织机械有限公司| 昆山翔固机械有限公司| 温州市日力轻工机械有限公司| 大丰 机械有限公司| 江阴市机械有限公司| 义乌机械设备有限公司| 山东宇冠机械有限公司| 山西贝斯特机械制造有限公司| 济南业兴通工程机械有限公司| 石家庄 机械有限公司| 连云港机械有限公司| 珠海精密机械有限公司| 安徽艾特巴机械制造有限公司| 新乡市中轻机械有限公司| 厦门机械设备有限公司| 伟业机械制造有限公司| 上海 机械设备有限公司| 青岛洪珠农业机械有限公司| 扬州扬工机械有限公司| 厦门洪海机械有限公司| 大连盘起工业有限公司| 沈阳维用精密机械有限公司| 杭州中力机械有限公司| 新晨动力机械有限公司| 河南省机械有限公司| 山东信川机械有限公司| 潍坊永成机械有限公司| 机械设备出口有限公司| 广东荣钢钢铁有限公司| 浙江建机工程机械有限公司| 上海汉享食品机械有限公司| 阳煤化机械有限公司| 溧阳科华机械制造有限公司| 河北小犟牛工程机械有限公司| 上海嘉亿机械有限公司| 唐山印刷机械有限公司| 德阳川广机械有限公司| 通力机械制造有限公司| 宿迁机械制造有限公司| 山东亚泰重型机械有限公司| 广西玉柴动力机械有限公司| 无锡精密机械有限公司| 食品包装机械有限公司| 深圳新添润彩印机械设备有限公司| 宁波利豪机械有限公司| 嘉兴机械有限公司招聘| 温州华珍机械有限公司| 上海建冶重工机械有限公司| 上海枫信传动机械有限公司 | 烟台海兰德机械设备有限公司| 广州广田包装机械有限公司| 卓轮天津机械有限公司| 沈阳精密机械有限公司| 上海乾享机械设备有限公司| 矿山机械设备有限公司| 福建起然燃气设备有限公司| 宁波力盟机械有限公司| 河南重工机械有限公司| 徐州丰展机械有限公司| 浙江风驰机械有限公司| 山推抚起机械有限公司| 郑州华龙机械工程有限公司| 无锡市川中五金机械有限公司| 威海石岛重工有限公司| 泰安古河机械有限公司| 苏州新风机械有限公司| 浙江华昌液压机械有限公司| 山东誉亚大豆机械制造有限公司 | 保定锐腾机械制造有限公司| 河南朝阳钢铁有限公司| 扬州 机械有限公司| 梁发记机械有限公司| 大连典石精密机械有限公司| 昆山之富士机械制造有限公司| 重庆箭驰机械有限公司| 上海制药机械有限公司| 福建南方路面机械有限公司| 昆山施耐特机械有限公司| 唐山九江钢铁有限公司| 国发重工机械有限公司| 山东造纸机械厂有限公司| 杭州德智机械有限公司| 台州市路桥奇勇农业机械有限公司 | 深圳市奥德机械有限公司| 无锡鹰普机械有限公司| 浙江天风塑料机械有限公司| 广州起重机械有限公司| 昆山奥德机械有限公司| 浙江杰豹机械有限公司| 鹰普机械宜兴有限公司| 上海华预机械制造有限公司| 广州甲宝机械有限公司| 东莞市乔锋机械有限公司| 云南旷迪机械有限公司| 开封茂盛机械有限公司| 深圳市力豪机械设备有限公司| 上海制药机械有限公司| 山东泰安煤矿机械有限公司 | 上海博强机械有限公司| 上海精工机械有限公司| 郑州华郑机械有限公司| 山东钢铁日照钢铁有限公司| 山东长城起重机械有限公司 | 江阴凯澄起重机械有限公司| 嘉兴敏实机械有限公司| 上海普顺机械电器制造有限公司| 山东建昌机械有限公司| 河北实阳机械有限公司| 鑫泰数控机械有限公司| 南通奥普机械工程有限公司| 大连工进机械制造有限公司| 昆山拓可机械有限公司| 深圳市钢铁有限公司| 浙江永达输送机械设备有限公司| 兴虎动力机械有限公司| 泰安华伟重工有限公司| 业精机械制造有限公司| 佛山市炬盈包装机械有限公司| 安徽正元机械有限公司| 山东明沃机械有限公司| 玉环县机械有限公司| 浙江乾坤机械有限公司| 成都液压机械有限公司| 中山凌宇机械有限公司| 宁波机械制造有限公司| 东莞市智科精密机械有限公司| 浙江荣升机械有限公司| 服装有限公司起名大全| 江阴锦澄钢铁有限公司| 河北冀工机械制造有限公司| 三国精密机械有限公司| 吉首市中诚制药机械有限公司 | 江阴华西钢铁有限公司| 浙江雨霖机械有限公司| 东莞兆恒机械有限公司| 武汉鑫巨力精密机械制造有限公司| 江苏新技机械有限公司| 玛狮工程机械有限公司| 河南路友机械有限公司| 河北东方德源机械制造有限公司| 上海玉程机械有限公司| 河北小松工程机械贸易有限公司| 徐州东南钢铁工业有限公司| 杭州机械设备有限公司| 河南双鑫钢铁有限公司| 扬州东进机械有限公司| 无锡永兴机械制造有限公司| 上海 精密机械制造有限公司| 上海集嘉机械有限公司| 福海鑫钢铁有限公司| 宁波塑料机械有限公司| 唐山燕山钢铁有限公司| 武汉益达建设机械有限公司| 纸箱机械设备有限公司| 南通宝钢钢铁有限公司| 徐州彭贝机械制造有限公司| 永达机械制造有限公司| 苏州松发机械有限公司| 福建起然燃气设备有限公司| 杭州机械设备有限公司| 华东油压机械制造有限公司| 芜湖 机械 有限公司| 河北 机械 有限公司| 长沙旭众机械设备有限公司| 邢台 机械有限公司| 启益电器机械有限公司| 淄博晟峰机械有限公司| 建湖液压机械有限公司| 江苏万宝机械有限公司| 济南威力机械有限公司| 东莞市锋机械有限公司| 南通虹波机械有限公司| 河北农哈哈机械有限公司| 郑州 机械 有限公司| 天津机械制造有限公司| 杭州联德机械有限公司| 广州市金王机械设备有限公司| 成都瑞迪机械实业有限公司| 泉州明辉机械有限公司| 上海楷钛机械制造有限公司| 诚鑫诚机械有限公司| 金昶泰机械设备有限公司| 恩格尔机械上海有限公司| 上海徽机械有限公司| 江苏精明机械有限公司| 上海余特包装机械制造有限公司| 锦州 机械有限公司| 广州乾能机械制造有限公司| 铜陵富鑫钢铁有限公司| 东莞市金坤机械设备有限公司 | 杭州东田机械有限公司| 合肥机械设备有限公司| 沈阳六和机械有限公司| 台州瑞进机械有限公司| 广州华臻机械设备有限公司| 湖北日朗机械制造有限公司| 山东欣弘发机械有限公司| 上海起重机有限公司| 宁海奇精机械有限公司| 无锡东元精密机械有限公司| 无锡械锐机械有限公司| 扬州福尔喜果蔬汁机械有限公司| 嘉兴格鲁博机械有限公司| 昆山博通机械设备有限公司| 河南重机械有限公司| 机械有限公司 法兰| 浙江海工机械有限公司| 山西秋林机械有限公司| 宜兴富曦机械有限公司| 济南天助升降机械有限公司| 青岛日佳机械有限公司| 佛山市康思达液压机械有限公司 | 昆明呈钢钢铁有限公司| 南通苏诺特包装机械有限公司| 三一工程机械有限公司| 四平现代钢铁有限公司| 星光传动机械有限公司| 嘉兴市宏丰机械有限公司| 北京富佳伟业机械制造有限公司| 徐州普特工程机械有限公司| 广州惠辉机械设备有限公司| 烟台安信精密机械有限公司| 常州 机械制造有限公司| 山推工程机械有限公司| 南昌欣向荣机械有限公司| 上海江南制药机械有限公司| 大连起重机有限公司| 青岛迪凯机械设备有限公司| 浙江欣炜机械有限公司| 东源精密机械有限公司| 泰州市机械有限公司| 力升机械有限公司.| 宁波市北仑机械制造有限公司 | 山东恒升机械有限公司| 四川兴明泰机械有限公司| 益丰泰机械有限公司| 江阴博纬机械有限公司| 河北圣禹水工机械有限公司| 广州益川机械有限公司| 郑州市同鼎机械设备有限公司| 上海上丰机械有限公司| 重庆屯茂机械有限公司| 工程机械有限公司经营范围| 西安市机械有限公司| 畜牧机械设备有限公司| 郑州重工机械有限公司| 鹤壁市豫星机械制造有限公司| 新乡市西贝机械有限公司| 河南瑞峰机械有限公司| 大连龙尧塑料机械有限公司| 华东造纸机械有限公司| 张家港机械有限公司| 宁波市凯博数控机械有限公司 | 莱州华汽机械有限公司| 杭州中亚机械有限公司| 上海起华机械有限公司| 天宇机械制造有限公司| 青岛双星铸造机械有限公司| 杭州金丰机械有限公司| 天津中核机械有限公司| 扬州东进机械有限公司| 北京 钢铁贸易有限公司| 东莞五金机械有限公司| 江阴市祥达机械制造有限公司| 北仑旭升机械有限公司| 苏州奥达机械部件有限公司| 青岛璞盛机械有限公司| 河南兴远起重机有限公司| 无锡诺亚机械有限公司| 龙工江西机械有限公司| 石家庄食品机械有限公司| 机械装备制造有限公司| 禹城通裕新能源机械铸造有限公司| 无锡通灵机械有限公司| 德莱赛机械苏州有限公司| 天津亨旺机械有限公司| 宁波天瑞精工机械有限公司| 宣城市 机械 有限公司| 河北实阳机械有限公司| 上海戴服特包装机械有限公司| 北京北宇机械设备有限公司 | 洛阳鑫超机械有限公司| 上海京悦机械有限公司| 常州天山重工机械有限公司| 太原 机械 有限公司| 青岛吉瑞特机械制造有限公司| 沈阳西城钢铁有限公司| 潞城兴宝钢铁有限公司| 南京钢铁联合有限公司| 上海传动机械有限公司| 广西利维重工有限公司| 潍坊圣川机械有限公司| 宁波迈拓斯数控机械有限公司| 廊坊机械设备有限公司| 安丘瑞源机械制造有限公司| 湖州卓信机械有限公司| 山东亚泰机械有限公司| 东莞宏品智能机械有限公司| 北京北宇机械设备有限公司| 昆山富邦机械有限公司| 首唐宝生钢铁有限公司| 佛山市陶瓷机械有限公司| 河南泰兴粮油机械设备有限公司 | 杭州萧山天成机械有限公司| 济南盛润机械有限公司| 张家港港龙机械有限公司| 东莞市亚龙玻璃机械有限公司| 昆山烽禾升精密机械有限公司| 浙江帅锋精密机械制造有限公司| 无锡橡塑机械有限公司| 宿迁 机械 有限公司| 陕西通运机械有限公司| 上海鸿尔机械有限公司| 浙江恒机械有限公司| 苏州丰裕机械工程有限公司| 机械自动化设备有限公司| 上海机械配件有限公司| 洛阳泰红农业机械有限公司| 上海建冶重工机械有限公司| 有限公司名字起名大全| 江苏方邦机械有限公司| 浙江江鑫机械有限公司| 上海紫明印刷机械有限公司| 宁波塑料机械制造有限公司 | 汕头市包装机械有限公司| 佛山市奥索包装机械有限公司| 江苏华澄重工有限公司| 深圳市美鹏机械设备有限公司| 浙江濠泰机械有限公司| 源鸿机械制造有限公司| 深圳市安格斯机械有限公司| 富华重工有限公司老板| 山东冠成机械有限公司| 石家庄 机械有限公司| 新兴移山天津重工有限公司| 上海善佳机械设备有限公司| 龙口旭鑫机械有限公司| 河北大恒重型机械有限公司 | 广东粤凯机械有限公司| 杭州 机械有限公司| 瑞迪机械实业有限公司| 常州捷佳创精密机械有限公司| 广州海缔机械有限公司| 江苏金鹰流体机械有限公司| 宁波 机械 有限公司| 唐山众达机械轧辊有限公司| 杭州永创机械有限公司| 上海杰姆博机械设备有限公司| 上海臣轩机械有限公司| 无锡东晨机械有限公司| 皋兰兰鑫钢铁有限公司| 烟台金土源机械化工程有限公司| 东泰机械制造有限公司| 上海乔麦包装机械有限公司 | 珠海裕丰钢铁有限公司| 无锡锡昌机械有限公司| 西子重工机械有限公司| 广州起航贸易有限公司| 烟台鼎科机械有限公司| 河南起重机械有限公司| 湘潭丰弘机械制造有限公司| 重庆春仁机械有限公司| 江苏长强钢铁有限公司| 振华真空机械有限公司| 无锡博雅德精密机械有限公司| 河南大方起重机有限公司| 汕头 机械有限公司| 唐山龙润机械有限公司| 深圳市铭利达精密机械有限公司| 沂水巨龙机械有限公司| 上海优拜机械有限公司| 东莞市科机械有限公司| 众旭食品机械有限公司| 上海江埔印刷机械有限公司| 西安北村精密机械有限公司| 上海颖盛机械有限公司| 成都市机械有限公司| 苏州仁成包装机械有限公司| 上海自动化机械有限公司| 苏拉纺织机械有限公司| 广州市善友机械设备有限公司| 上海轶鹰起重机械有限公司| 重庆嘉木机械有限公司| 常州市锦益机械有限公司| 郑州机械设备有限公司| 陕西恒德精密机械有限公司| 上海 包装机械有限公司| 扬州恒佳机械有限公司| 黄石华旦机械制造有限公司| 九江%机械有限公司| 洛北重工机械有限公司| 碎得机械北京有限公司| 上海瑞阳机械有限公司| 嘉兴敏实机械有限公司| 丝网机械设备有限公司| 青岛沃隆花生机械有限公司| 山东永健机械有限公司| 昆山总馨机械有限公司| 旭英机械有限公司招聘| 慈溪市机械有限公司| 长沙力诺机械有限公司| 常州杰和机械有限公司| 国义特种钢铁有限公司| 湖南 机械有限公司| 浙江金奔机械制造有限公司| 淄博晟峰机械有限公司| 杭州机械设备制造有限公司| 青岛科尼乐机械设备有限公司 | 三力机械制造有限公司| 苏州同鑫鸿精密机械有限公司| 杭州杭奥机械有限公司| 青岛三益塑料机械有限公司| 全氏食品机械(上海)有限公司| 欧力特机械有限公司| 北京大森包装机械有限公司| 六安恒源机械有限公司| 江苏鹤溪机械有限公司| 河南胜飞石油机械有限公司 | 比力特机械有限公司| 杭州三瑞机械有限公司| 大连正丰机械有限公司| 郑州市机械设备有限公司| 唐山津西钢铁有限公司| 沧州恒宇机械有限公司| 浙江起步儿童用品有限公司| 德州佳永机械制造有限公司| 中山精密机械有限公司| 上海舜锋机械制造有限公司| 中山艾能机械有限公司| 苏州联佳精密机械有限公司| 西安海焱机械有限公司| 新乡市矿山起重机械有限公司| 台州市路桥奇勇农业机械有限公司 | 盐城益聚达机械有限公司| 济南精密机械有限公司| 上海海韬机械有限公司| 贵州凯星液力传动机械有限公司| 上海包装机械有限公司| 山东鲁一机械有限公司| 无锡杨佳机械有限公司| 河南龙工机械制造有限公司| 昆山协扬机械有限公司| 邢台振成机械有限公司| 钜业机械设备有限公司| 郑州市同鼎机械设备有限公司| 中施机械设备有限公司| 江苏泰美环保机械有限公司| 江阴机械制造有限公司怎么样 | 上海昊宇机械有限公司| 宝力机械有限公司招聘| 合肥华运机械制造有限公司| 捷赛机械苏州有限公司| 江苏巨威机械有限公司| 常州奥恒机械有限公司| 淄博联泰机械有限公司| 河南兴邦重工机器有限公司| 三星重工业宁波有限公司招聘| 德清恒丰机械有限公司| 重庆科邦机械有限公司| 重庆太强机械有限公司| 江苏华光双顺机械制造有限公司 | 云南科玛机械设备有限公司| 浙江超伟机械有限公司| 上海三景机械有限公司| 杭州科豪机械有限公司| 俊杰机械深圳有限公司| 江苏迪鼎机械有限公司| 江西钧天机械有限公司| 杭州同创顶立机械有限公司| 布勒常州机械有限公司| 辽宁春光机械有限公司| 泰上机械设备有限公司| 广东达诚机械有限公司| 瑞鼎精密机械有限公司| 广东盈钢机械有限公司| 苏州星光精密机械有限公司| 济南北斗星机械设备有限公司| 泰兴市立君机械设备有限公司| 昆山乙盛机械工业有限公司电话| 西安柳工机械有限公司| 乙盛机械工业有限公司| 北京中车重工机械有限公司| 广东恒联食品机械有限公司| 德州石油机械有限公司| 东莞市腾机械有限公司| 常熟市机械有限公司| 佛山市三良机械设备有限公司| 江苏大圣机械制造有限公司| 江苏双箭输送机械有限公司| 山东长江机械有限公司| 湖南长河机械有限公司| 浙江邦泰机械有限公司| 昆成机械机械有限公司| 太仓倍加机械有限公司| 蓬莱巨涛海洋工程重工有限公司怎么样 | 云南科玛机械设备有限公司| 苏州锐豪机械制造有限公司| 山东旭升机械有限公司| 东莞宏彰机械有限公司| 温州瑞达机械有限公司| 上海建筑机械有限公司| 德州仁信印染机械有限公司| 泰州市机械有限公司| 北京京民兴机械设备有限公司 | 东泰盛机械有限公司| 卓郎智能机械有限公司| 泉州市工程机械有限公司| 柳州丹顺机械有限公司| 苏州一工机械有限公司| 中船重工重庆液压机电有限公司| 合肥食品机械有限公司| 东莞市卓越机械有限公司招聘| 北京富佳伟业机械制造有限公司 | 浙江新德宝机械有限公司| 成都 精密机械有限公司| 中船重工环境工程有限公司怎么样| 杭州春江制药机械有限公司| 重庆嘉木机械有限公司| 杭州力诺机械设备有限公司| 中施机械设备有限公司| 瑞安正博机械有限公司| 无锡新麦机械有限公司| 星包装机械有限公司| 上海冉本机械制造有限公司 | 上海众冠食品机械有限公司 | 广东富华重工制造有限公司| 安丰钢铁有限公司地址| 大丰联鑫钢铁有限公司| 安阳永兴钢铁有限公司| 天津机械配件有限公司| 西安凌通机械有限公司| 广东乐善机械有限公司| 苏州动力机械有限公司| 台湾晁群机械有限公司| 兴世机械制造有限公司| 新乡振动机械有限公司| 台州亚格机械有限公司| 湖南汇杰机械设备有限公司| 台州市机械有限公司| 东莞市联顺机械有限公司| 上海钊凯包装机械有限公司| 济南科华机械有限公司| 佛山机械设备有限公司| 江阴凯迈机械有限公司| 中山市信元铝门窗机械制造有限公司| 浙江晟达机械有限公司| 浙江卓驰机械有限公司| 上海容安木工机械设备有限公司| 济南齐力升降机械有限公司| 苏州全彩机械设备有限公司| 潍坊铭金机械有限公司| 扬州恒佳机械有限公司| 大连船舶重工有限公司| 张家港和和机械有限公司| 新乡市先锋振动机械有限公司| 山东山推工程机械结构件有限公司| 人科机械设备有限公司| 中信重工开诚智能装备有限公司| 西安普阳机械有限公司| 宁波丰州机械有限公司| 广东力丰机械有限公司| 佛山建邦机械有限公司| 深圳起航电商有限公司| 普惠环保机械有限公司| 农业机械制造有限公司| 西帕机械杭州有限公司| 丰润区钢铁有限公司| 上海申越包装机械制造有限公司 | 沈阳联合利邦机械有限公司| 昆山东新力特精密机械有限公司| 江苏别具匠心机械设备有限公司| 泰安东岳重工有限公司|