In my blog Implement CGLIB in ABAP I demonstrate how to create dynamical proxy class via CGLIB in Java and ABAP. The generated proxy class is actually a subclass which inherits the base class. Such class created by CGLIB is transient, which means the life time of generated class is only within the current session where it is created, which will not be persisted.
In this blog I will show how to create a globally persistent proxy class dynamically in Java and ABAP.
The example is built based on Proxy design pattern.
Dynamic proxy in Java
There is one interface:Then I will create a dynamic proxy class ( which will be persisted to my laptop ) based on HelloWorldImp, with additional line System.out.println(\”Before Hello World!\”); before original method print() and System.out.println(\”After Hello World!\”); after method print().
The class object of generated proxy class is created via the following method which consists of four steps:step2: create a new .java file in disk with source code generated in previous step:
Dynamic proxy in ABAP
Again there is an interface IF_HELLOWORLD and an implementation class CL_HELLOWORLD based on which a new proxy class will be created dynamically.
(1) The original instance of class CL_HELLOWORLD is passed to GET_PROXY method. Inside this method, it will inject the pre exit and post exit logic into the original implementation of print method. The injection is done in a new class, whose name is passed via parameter iv_new_class_name, in this example, ZCLABAP.
(2) Once the above report is executed, the injected proxy instance returned in line 10 contains the enhanced logic so as expected you can now see the ABAP statement passed in iv_pre_exit and iv_post_exit are executed.
Brief explanation about main logic of dynamic proxy generation
(1) extract_interface_info
extract the involved interface name and the name of method to be injected via RTTI against passed reference via parameter io_origin
(2) prepare_source_code
Inject the pre exit and post exit statement into method source code internal table.
(3) prepare_attr_and_signature
Prepare method signature and private attribute for new class
(4) generate_class
Call ABAP class generation function module based on metadata assembled by previous two steps.Further reading
I have written a series of blogs which compare the language feature among ABAP, JavaScript and Java. You can find a list of them below:
Lazy Loading, Singleton and Bridge design pattern in JavaScript and in ABAP
Functional programming – Simulate Curry in ABAP
Functional Programming – Try Reduce in JavaScript and in ABAP
Simulate Mockito in ABAP
A simulation of Java Spring dependency injection annotation @Inject in ABAP
Singleton bypass – ABAP and Java
Weak reference in ABAP and Java
Fibonacci Sequence in ES5, ES6 and ABAP
Java byte code and ABAP Load
How to write a correct program rejected by compiler: Exception handling in Java and in ABAP
An small example to learn Garbage collection in Java and in ABAP
String Template in ABAP, ES6, Angular and React
Try to access static private attribute via ABAP RTTI and Java Reflection
Local class in ABAP, Java and JavaScript
Integer in ABAP, Java and JavaScript
Covariance in Java and simulation in ABAP
Various Proxy Design Pattern implementation variants in Java and ABAP