Meniru Warisan Anotasi dalam Java dengan AspectJ
Di Java, anotasi pada antara muka, kaedah atau anotasi tidak diwarisi secara automatik oleh kelas pelaksananya , kaedah mengatasi atau anotasi beranotasi. Walaupun anotasi @Inherited Java membenarkan warisan anotasi untuk kelas dan subkelas, ia tidak meluas kepada senario yang dinyatakan di atas.
AspectJ boleh meniru warisan anotasi dengan mentakrifkan pengisytiharan antara jenis (ITD). ITD menyediakan cara untuk menambah dan mengubah suai anotasi secara atur cara pada jenis, kaedah dan medan pada masa penyusunan.
Dalam contoh ini, anotasi @Marker digunakan untuk menganotasi antara muka MyInterface dan kaedahnya dua(). Walau bagaimanapun, aspek AspectJ yang sepatutnya memintas pelaksanaan kelas dan kaedah yang dijelaskan dengan @Marker tidak mencetuskan.
Penyelesaian:
Untuk meniru warisan anotasi untuk antara muka dan kaedah, anda boleh menggunakan penyelesaian berikut dengan AspectJ:
<code class="java">public aspect MarkerAnnotationInheritor { // Implementing classes should inherit marker annotation declare @type: MyInterface+ : @Marker; // Overriding methods 'two' should inherit marker annotation declare @method : void MyInterface+.two() : @Marker; }</code>
Aspek ini pada asasnya menambahkan anotasi @Marker kepada semua kelas pelaksana dan kaedah mengatasi MyInterface, meniru warisan anotasi dengan berkesan.
Penyelesaian Alternatif:
Anda juga boleh membenamkan aspek terus ke dalam antara muka, mewujudkan pelaksanaan warisan anotasi serba lengkap:
<code class="java">public interface MyInterface { // ... // Embedded AspectJ aspect public static aspect MarkerAnnotationInheritor { // ... } }</code>
Nota: Apabila menggunakan AspectJ untuk meniru warisan anotasi, aspek ITD mesti diletakkan sebelum pengisytiharan jenis atau kaedah yang dirujuknya dalam kod sumber. Ini memastikan bahawa pengkompil AspectJ menggunakan ITD sebelum fasa kompilasi Java biasa.
Atas ialah kandungan terperinci Bagaimana untuk Meniru Warisan Anotasi untuk Antara Muka dan Kaedah Overriding dalam Java Menggunakan AspectJ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!