日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Jerry文章《浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试一文的源代码》

發布時間:2023/12/19 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jerry文章《浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试一文的源代码》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接

導航目錄

  • 工具類ZCL_ABAP_DYNAMIC_PROXY_FACTORY
  • 工具類zcl_abap_cglib_tool
  • Jerry Wang的ABAP專題文章

工具類ZCL_ABAP_DYNAMIC_PROXY_FACTORY

該工具類負責生產一個新的具有持久化存儲的靜態代理類:

class ZCL_ABAP_DYNAMIC_PROXY_FACTORY definitionpublicfinalcreate public .public section.class-methods GET_PROXYimporting!IO_ORIGIN type ref to OBJECT!IV_NEW_CLASS_NAME type STRING!IV_PRE_EXIT type STRING!IV_POST_EXIT type STRINGreturningvalue(RO_PROXY) type ref to OBJECT . protected section. private section.class-data MS_VSEOCLASS type VSEOCLASS .class-data MT_ATTRIBUTE type SEOO_ATTRIBUTES_R .class-data MT_IMP_IF type SEOR_IMPLEMENTINGS_R .class-data MT_METHODS type SEOO_METHODS_R .class-data MT_PARAMETERS type SEOS_PARAMETERS_R .class-data MV_INTERFACE_NAME type STRING .class-data MV_METHOD_NAME type STRING .class-data MT_SOURCECODE type SEO_METHOD_SOURCE_TABLE .class-data MV_NEW_CLASS_NAME type STRING .class-data MO_ORIGIN type ref to OBJECT .class-data MV_PRE_EXIT type STRING .class-data MV_POST_EXIT type STRING .class-methods GENERATE_CLASS .class-methods PREPARE_ATTR_AND_SIGNATURE .class-methods PREPARE_SOURCE_CODE .class-methods EXTRACT_INTERFACE_INFOimporting!IO_ORIGIN type ref to OBJECT .class-methods INITimporting!IV_NEW_CLASS_NAME type STRING!IO_ORIGIN type ref to OBJECT!IV_PRE_EXIT type STRING!IV_POST_EXIT type STRING .class-methods CREATE_INSTANCEreturningvalue(RO_PROXY) type ref to OBJECT . ENDCLASS.CLASS ZCL_ABAP_DYNAMIC_PROXY_FACTORY IMPLEMENTATION.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Private Method ZCL_ABAP_DYNAMIC_PROXY_FACTORY=>CREATE_INSTANCE * +-------------------------------------------------------------------------------------------------+ * | [<-()] RO_PROXY TYPE REF TO OBJECT * +--------------------------------------------------------------------------------------</SIGNATURE>method CREATE_INSTANCE.TRY.create object ro_proxy type (mv_new_class_name)EXPORTINGio_origin = mo_origin.CATCH cx_root INTO data(cx_root).WRITE:/ 'instance created failed: ', cx_root->get_text( ).ENDTRY.endmethod.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Private Method ZCL_ABAP_DYNAMIC_PROXY_FACTORY=>EXTRACT_INTERFACE_INFO * +-------------------------------------------------------------------------------------------------+ * | [--->] IO_ORIGIN TYPE REF TO OBJECT * +--------------------------------------------------------------------------------------</SIGNATURE>method EXTRACT_INTERFACE_INFO.data(lo_class) = cast CL_ABAP_OBJECTDESCR( cl_abap_objectdescr=>describe_by_object_ref( io_origin ) ).READ TABLE lo_class->interfaces INTO mv_interface_name INDEX 1 .CHECK sy-subrc = 0."For demo purpose, I assume only one method in one interfaceSELECT SINGLE cmpname INTO mv_method_name FROM seocompoWHERE clsname = mv_interface_name.endmethod.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Private Method ZCL_ABAP_DYNAMIC_PROXY_FACTORY=>GENERATE_CLASS * +-------------------------------------------------------------------------------------------------+ * +--------------------------------------------------------------------------------------</SIGNATURE>METHOD generate_class.CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE'EXPORTINGdevclass = '$TMP'version = seoc_version_activeauthority_check = abap_trueoverwrite = abap_truesuppress_method_generation = abap_falsegenflag = abap_falsemethod_sources = mt_sourcecodesuppress_dialog = abap_trueCHANGINGclass = ms_vseoclassmethods = mt_methodsparameters = mt_parametersimplementings = mt_imp_ifattributes = mt_attributeEXCEPTIONSexisting = 1is_interface = 2db_error = 3component_error = 4no_access = 5other = 6OTHERS = 7.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Public Method ZCL_ABAP_DYNAMIC_PROXY_FACTORY=>GET_PROXY * +-------------------------------------------------------------------------------------------------+ * | [--->] IO_ORIGIN TYPE REF TO OBJECT * | [--->] IV_NEW_CLASS_NAME TYPE STRING * | [--->] IV_PRE_EXIT TYPE STRING * | [--->] IV_POST_EXIT TYPE STRING * | [<-()] RO_PROXY TYPE REF TO OBJECT * +--------------------------------------------------------------------------------------</SIGNATURE>method GET_PROXY.init( iv_new_class_name = iv_new_class_name io_origin = io_originiv_pre_exit = iv_pre_exit iv_post_exit = iv_post_exit ).extract_interface_info( io_origin ).prepare_source_code( ).prepare_attr_and_signature( ).generate_class( ).ro_proxy = create_instance( ).endmethod.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Private Method ZCL_ABAP_DYNAMIC_PROXY_FACTORY=>INIT * +-------------------------------------------------------------------------------------------------+ * | [--->] IV_NEW_CLASS_NAME TYPE STRING * | [--->] IO_ORIGIN TYPE REF TO OBJECT * | [--->] IV_PRE_EXIT TYPE STRING * | [--->] IV_POST_EXIT TYPE STRING * +--------------------------------------------------------------------------------------</SIGNATURE>method INIT.clear: mv_interface_name, mv_method_name, mt_sourcecode,mt_sourcecode,mt_imp_if, ms_vseoclass, mt_attribute,mt_parameters,mt_methods.mv_new_class_name = iv_new_class_name.mo_origin = io_origin.mv_pre_exit = iv_pre_exit.mv_post_exit = iv_post_exit.endmethod.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Private Method ZCL_ABAP_DYNAMIC_PROXY_FACTORY=>PREPARE_ATTR_AND_SIGNATURE * +-------------------------------------------------------------------------------------------------+ * +--------------------------------------------------------------------------------------</SIGNATURE>METHOD prepare_attr_and_signature.DATA:ls_attribute LIKE LINE OF mt_attribute,ls_parameter LIKE LINE OF mt_parameters,ls_method LIKE LINE OF mt_methods.ls_method-clsname = mv_new_class_name.ls_method-cmpname = 'CONSTRUCTOR'.ls_method-state = 1. "implementedls_method-exposure = 2. "publicAPPEND ls_method TO mt_methods.ls_parameter-clsname = mv_new_class_name.ls_parameter-cmpname = 'CONSTRUCTOR'.ls_parameter-version = 1.ls_parameter-descript = 'Constructor automatically generated by Jerry'.ls_parameter-type = 'OBJECT'."mv_interface_name.ls_parameter-sconame = 'IO_ORIGIN'.ls_parameter-cmptype = 1. "METHODls_parameter-mtdtype = 0. "METHODls_parameter-pardecltyp = 0. "IMPORTINGls_parameter-parpasstyp = 1. "pass by referencels_parameter-typtype = 3. "type ref toAPPEND ls_parameter TO mt_parameters.ls_attribute-clsname = mv_new_class_name.ls_attribute-cmpname = 'MO_ORIGIN'.ls_attribute-state = 1.ls_attribute-attdecltyp = 0.ls_attribute-attexpvirt = 0. "privatels_attribute-typtype = 3. "type ref tols_attribute-type = 'OBJECT'."mv_interface_name.APPEND ls_attribute TO mt_attribute.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Private Method ZCL_ABAP_DYNAMIC_PROXY_FACTORY=>PREPARE_SOURCE_CODE * +-------------------------------------------------------------------------------------------------+ * +--------------------------------------------------------------------------------------</SIGNATURE>METHOD prepare_source_code.DATA: ls_method_source TYPE seo_method_source,ls_imp_if TYPE seor_implementing_r,ls_imp_det TYPE seoredef.ms_vseoclass-clsname = mv_new_class_name.ms_vseoclass-state = seoc_state_implemented.ms_vseoclass-exposure = seoc_exposure_public.ms_vseoclass-descript = `Dynamic proxy generated by Jerry's code`.ms_vseoclass-langu = sy-langu.ms_vseoclass-clsccincl = abap_true.ms_vseoclass-unicode = abap_true.ms_vseoclass-fixpt = abap_true.ms_vseoclass-clsfinal = abap_true.ls_imp_det = ls_imp_if-clsname = mv_new_class_name.ls_imp_det = ls_imp_if-refclsname = mv_interface_name.ls_imp_if-state = seoc_state_implemented.APPEND ls_imp_if TO mt_imp_if.CLEAR: ls_method_source.DATA: lv_name TYPE string.ls_method_source-cpdname = |{ mv_interface_name }~{ mv_method_name }|.APPEND |{ mv_pre_exit }| TO ls_method_source-source.APPEND |DATA(lo) = CAST { mv_interface_name }( mo_origin ).| to ls_method_source-source.APPEND 'lo->print( ).' TO ls_method_source-source.APPEND |{ mv_post_exit }| TO ls_method_source-source.APPEND ls_method_source TO mt_sourcecode.CLEAR: ls_method_source.ls_method_source-cpdname = 'CONSTRUCTOR'.APPEND 'mo_origin = io_origin.' TO ls_method_source-source.APPEND ls_method_source TO mt_sourcecode.ENDMETHOD. ENDCLASS.

工具類zcl_abap_cglib_tool

這個類是Jerry仿照Java CGLIB(Code Generation Library)創建的, 針對傳入的一個ABAP類,能創建一個生命周期只有當前會話(current session)內的代理類,該代理類是傳入ABAP類的子類。這意味著傳入的ABAP類必須能夠被繼承,不能被標記為final.

CLASS zcl_abap_cglib_tool DEFINITIONPUBLICFINALCREATE PUBLIC .PUBLIC SECTION.CLASS-METHODS get_proxyIMPORTING!iv_class_name TYPE string!io_pre_exit TYPE REF TO if_preexit!io_post_exit TYPE REF TO if_postexitRETURNINGVALUE(ro_proxy) TYPE REF TO object .PROTECTED SECTION.PRIVATE SECTION.CLASS-DATA mv_class_name TYPE string .CLASS-DATA mt_source TYPE seop_source_string .CLASS-DATA mo_proxy TYPE REF TO object .CLASS-DATA mo_preexit TYPE REF TO if_preexit .CLASS-DATA mo_postexit TYPE REF TO if_postexit .CLASS-METHODS generate_proxy .CLASS-METHODS get_source_code . ENDCLASS.CLASS ZCL_ABAP_CGLIB_TOOL IMPLEMENTATION.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Private Method ZCL_ABAP_CGLIB_TOOL=>GENERATE_PROXY * +-------------------------------------------------------------------------------------------------+ * +--------------------------------------------------------------------------------------</SIGNATURE>METHOD generate_proxy.DATA(lv_new_cls_name) = mv_class_name && '_SUB'.DATA(lv_inherit) = |inheriting from { mv_class_name }|.TRANSLATE lv_new_cls_name TO UPPER CASE.TRY.LOOP AT mt_source ASSIGNING FIELD-SYMBOL(<source1>) WHERE table_line CS mv_class_name.REPLACE mv_class_name IN <source1> WITH lv_new_cls_name.ENDLOOP.LOOP AT mt_source ASSIGNING FIELD-SYMBOL(<source>) WHERE table_line CS mv_class_name.DELETE mt_source INDEX ( sy-tabix + 1 ).INSERT lv_inherit INTO mt_source INDEX ( sy-tabix + 1 ).EXIT.ENDLOOP.GENERATE SUBROUTINE POOL mt_source NAME DATA(prog).WRITE: / sy-subrc.DATA(class) = |\\PROGRAM={ prog }\\CLASS={ lv_new_cls_name }|.CREATE OBJECT mo_proxy TYPE (class).CALL METHOD mo_proxy->('SET_PREEXIT')EXPORTINGio_preexit = mo_preexit.CALL METHOD mo_proxy->('SET_POSTEXIT')EXPORTINGio_postexit = mo_postexit.CATCH cx_root INTO DATA(cx_root).WRITE: / cx_root->get_text( ).ENDTRY.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Public Method ZCL_ABAP_CGLIB_TOOL=>GET_PROXY * +-------------------------------------------------------------------------------------------------+ * | [--->] IV_CLASS_NAME TYPE STRING * | [--->] IO_PRE_EXIT TYPE REF TO IF_PREEXIT * | [--->] IO_POST_EXIT TYPE REF TO IF_POSTEXIT * | [<-()] RO_PROXY TYPE REF TO OBJECT * +--------------------------------------------------------------------------------------</SIGNATURE>METHOD get_proxy.mv_class_name = iv_class_name.mo_preexit = io_pre_exit.mo_postexit = io_post_exit.CLEAR: mo_proxy.get_source_code( ).generate_proxy( ).ro_proxy = mo_proxy.ENDMETHOD.* <SIGNATURE>---------------------------------------------------------------------------------------+ * | Static Private Method ZCL_ABAP_CGLIB_TOOL=>GET_SOURCE_CODE * +-------------------------------------------------------------------------------------------------+ * +--------------------------------------------------------------------------------------</SIGNATURE>METHOD get_source_code.DATA:cifkey TYPE seoclskey,clstype TYPE seoclstype,source TYPE seop_source_string,pool_source TYPE seop_source_string,l_string TYPE string,source_line TYPE LINE OF seop_source_string,tabix TYPE sytabix,includes TYPE seop_methods_w_include,include TYPE seop_method_w_include,cifref TYPE REF TO if_oo_clif_incl_naming,clsref TYPE REF TO if_oo_class_incl_naming,intref TYPE REF TO if_oo_interface_incl_naming.cifkey-clsname = mv_class_name.CALL METHOD cl_oo_include_naming=>get_instance_by_cifkeyEXPORTINGcifkey = cifkeyRECEIVINGcifref = cifrefEXCEPTIONSOTHERS = 1.ASSERT sy-subrc = 0.APPEND 'program.' TO mt_source.CHECK cifref->clstype = seoc_clstype_class.clsref ?= cifref.READ REPORT clsref->class_pool INTO pool_source.READ REPORT clsref->locals_old INTO source.LOOP AT source INTO source_line.IF source_line NS '*"*'.APPEND source_line TO mt_source..ENDIF.ENDLOOP.READ REPORT clsref->locals_def INTO source.LOOP AT source INTO source_line.IF source_line NS '*"*'.APPEND source_line TO mt_source..ENDIF.ENDLOOP.READ REPORT clsref->locals_imp INTO source.LOOP AT source INTO source_line.IF source_line NS '*"*'.APPEND source_line TO mt_source..ENDIF.ENDLOOP.READ REPORT clsref->public_section INTO source.LOOP AT source ASSIGNING FIELD-SYMBOL(<source_line>).IF <source_line> NS '*"*'.FIND REGEX '.*methods.*\.' IN <source_line> MATCH LENGTH DATA(lv_len).IF sy-subrc = 0.lv_len = lv_len - 1.<source_line> = <source_line>+0(lv_len).CONCATENATE <source_line> 'redefinition' '.' INTO <source_line> SEPARATED BY space.ENDIF.APPEND <source_line> TO mt_source.ENDIF.ENDLOOP.APPEND 'methods SET_PREEXIT importing !IO_PREEXIT type ref to IF_PREEXIT .' TO mt_source.APPEND 'methods SET_POSTEXIT importing !IO_POSTEXIT type ref to IF_POSTEXIT .' TO mt_source.READ REPORT clsref->protected_section INTO source.LOOP AT source INTO source_line.IF source_line NS '*"*'.APPEND source_line TO mt_source.ENDIF.ENDLOOP.READ REPORT clsref->private_section INTO source.LOOP AT source INTO source_line.IF source_line NS '*"*'.APPEND source_line TO mt_source.ENDIF.ENDLOOP.APPEND 'data MO_PREEXIT type ref to IF_PREEXIT .' TO mt_source.APPEND 'data MO_POSTEXIT type ref to IF_POSTEXIT .' TO mt_source.CONCATENATE 'CLASS' cifkey 'IMPLEMENTATION' INTO l_string SEPARATED BY space.LOOP AT pool_source FROM tabix INTO source_line.IF source_line CS 'ENDCLASS'.APPEND source_line TO mt_source..ENDIF.IF source_line CS l_string.SKIP.APPEND source_line TO mt_source..tabix = sy-tabix.EXIT.ENDIF.ENDLOOP.includes = clsref->get_all_method_includes( ).LOOP AT includes INTO include.READ REPORT include-incname INTO source.INSERT 'mo_preexit->execute( ).' INTO source INDEX 2.INSERT 'mo_postexit->execute( ).' INTO source INDEX ( lines( source ) ).LOOP AT source INTO source_line.APPEND source_line TO mt_source..ENDLOOP.ENDLOOP.APPEND 'method set_preexit. mo_preexit = IO_PREEXIT. endmethod.' TO mt_source.APPEND 'method set_postexit. mo_postexit = IO_POSTEXIT. endmethod.' TO mt_source.LOOP AT pool_source FROM tabix INTO source_line.IF source_line CS 'ENDCLASS'.APPEND source_line TO mt_source..ENDIF.ENDLOOP.ENDMETHOD. ENDCLASS.

Jerry Wang的ABAP專題文章

  • Jerry的ABAP, Java和JavaScript亂燉

  • ABAP開發人員未來應該學些什么

  • Jerry 2017年的五一小長假:8種經典排序算法的ABAP實現

  • Jerry的ABAP原創技術文章合集

  • 300行ABAP代碼實現一個最簡單的區塊鏈原型

  • 使用Java+SAP云平臺+SAP Cloud Connector調用ABAP On-Premise系統里的函數

  • 在SAP云平臺的CloudFoundry環境下消費ABAP On-Premise OData服務

  • ABAP vs Java, 蛙泳 vs 自由泳

  • 聊聊C語言和ABAP

  • 動手使用ABAP Channel開發一些小工具,提升日常工作效率

  • 我用ABAP做過的那些無聊的事情

  • 不喜歡SAP GUI?那試試用Eclipse進行ABAP開發吧

  • 使用Visual Studio Code編寫和激活ABAP代碼

  • 你的ABAP程序給佛祖開過光么?來試試Jerry這個小技巧

  • 在SAP云平臺ABAP編程環境上編寫第一段ABAP程序

  • SAP官方發布的ABAP編程規范

  • ABAP Code Inspector那些隱藏的功能,您都知道嗎?

  • 還在用ABAP進行SAP產品的二次開發?來了解下這種全新的二次開發理念吧

  • ABAP Netweaver體內的那些寄生式編程語言

  • 從SAP社區上的一篇博客開始,聊聊SAP產品命名背后的那份情懷

  • 云端的ABAP Restful服務開發

  • 如何在SAP云平臺ABAP編程環境里把CDS view暴露成OData服務

  • 使用abapGit在ABAP On-Premises系統和SAP云平臺ABAP環境之間進行代碼傳輸

  • 30分鐘用Restful ABAP Programming模型開發一個支持增刪改查的Fiori應用

  • Jerry帶您了解Restful ABAP Programming模型系列之二:Action和Validation的實現

  • Jerry帶您了解Restful ABAP Programming模型系列之三:云端ABAP應用調試

  • SAP云平臺上的ABAP編程環境里如何消費第三方服務

  • ABAP開發者上云的時候到了 - 現在大家可以免費使用SAP云平臺ABAP環境的試用版了

  • 學而不思則罔 - SAP云平臺ABAP編程環境的由來和適用場景

  • SAP云平臺里的三叉戟應用

  • 如何基于Restful ABAP Programming模型開發并部署一個支持增刪改查的Fiori應用

  • SAP 2019 TechEd Key Note解讀:云時代下SAP從業人員如何做二次開發?

  • 有哪些ABAP關鍵字和語法,到了ABAP云環境上就沒辦法用了?

  • ABAP開發環境終于支持以駝峰命名法自動格式化ABAP變量名了

  • 利用ABAP 740的新關鍵字REDUCE完成一個實際工作任務

  • 一段讓人瑟瑟發抖的ABAP代碼

  • 昨日萬圣節ABAP怪獸級代碼謎團,公布答案啦

  • 介紹一種在ABAP內核態進行內表高效拷貝的方法

  • 使用SAP Cloud Application Programming模型開發OData的一個實際例子

  • 當ABAP遇見普羅米修斯

  • 使用ABAP繪制可伸縮矢量圖

  • ABAP開發環境語法高亮的那些事兒

  • SAP錯誤消息調試之七種武器:讓所有的錯誤消息都能被定位

  • 使用ABAP操作Excel的幾種方法

  • SAP GUI里的收藏夾事務碼管理工具

  • SAP GUI和Windows注冊表

  • 有了Debug權限就能干壞事?小心了,你的一舉一動盡在系統監控中

  • ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX這些東東是什么鬼

  • 實現ABAP條件斷點的三種方式

  • 使用SAT跟蹤監控從瀏覽器打開的SAP應用的性能和調用棧

  • 一個13年ABAP老兵的建議:了解這些基礎知識,對ABAP開發有百利而無一害

  • SAP ABAP Netweaver容器化, 不可能完成的任務嗎?

  • SAP產品增強技術回顧

  • SAP API開發方法大全

總結

以上是生活随笔為你收集整理的Jerry文章《浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试一文的源代码》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。