Rumah >Java >javaTutorial >Bolehkah Anda Mencontohi Warisan Anotasi untuk Antara Muka dan Kaedah Menggunakan AspectJ?
Emulasi Warisan Anotasi untuk Antara Muka dan Kaedah dengan AspectJ
Banyak pembangun Java menghadapi isu yang berkaitan dengan warisan anotasi. Di Java, anotasi pada antara muka, kaedah dan anotasi lain tidak diwarisi dengan melaksanakan kelas, kaedah mengatasi atau kelas menggunakan anotasi beranotasi. Ini kerana, menurut JVM, pewarisan anotasi hanya berlaku daripada kelas kepada subkelas apabila jenis anotasi dalam superclass membawa anotasi meta @Inherited.
Dalam artikel ini, kita akan meneroka senario di mana a anotasi penanda digunakan untuk menganotasi antara muka dan kaedahnya. Walau bagaimanapun, apabila sesuatu aspek ditakrifkan untuk memintas pelaksanaan kelas dan kaedah beranotasi, ia gagal berbuat demikian. Ini kerana AspectJ mematuhi had JVM berkenaan warisan anotasi.
Mencontohi Warisan Anotasi
Untuk menangani isu ini, penyelesaian menggunakan AspectJ boleh dilaksanakan untuk meniru warisan anotasi untuk antara muka atau kaedah tertentu. Penyelesaian ini melibatkan penentuan aspek AspectJ yang menambahkan anotasi yang diingini secara manual pada kelas pelaksana dan kaedah mengatasi. Aspek tersebut boleh ditakrifkan seperti berikut:
<code class="java">package de.scrum_master.aspect; import de.scrum_master.app.Marker; import de.scrum_master.app.MyInterface; 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>
Selepas menggunakan aspek ini, JVM menganggap kelas pelaksana dan kaedah mengatasi seolah-olah mereka telah diberi anotasi secara eksplisit dengan anotasi @Marker. Akibatnya, aspek tersebut kini boleh memintas pelaksanaan kelas dan kaedah ini.
Pendekatan Alternatif
Pendekatan alternatif ialah membenamkan aspek terus ke dalam antara muka. Pendekatan ini memastikan semua anotasi yang diperlukan ditakrifkan di satu tempat. Contoh pelaksanaan adalah seperti berikut:
<code class="java">package de.scrum_master.app; public interface MyInterface { void one(); void two(); // Cannot omit 'static' here due to https://bugs.eclipse.org/bugs/show_bug.cgi?id=571104 public static 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>
Dalam kes ini, definisi aspek bersarang dalam antara muka itu sendiri, menghapuskan keperluan untuk fail aspek yang berasingan.
Kesimpulan
Untuk mencapai warisan anotasi bagi antara muka dan kaedah dalam Java, adalah penting untuk memahami batasan JVM dan peranan AspectJ dalam meniru tingkah laku sedemikian. Penyelesaian yang dibincangkan dalam artikel ini menyediakan penyelesaian yang berkesan untuk cabaran biasa ini.
Atas ialah kandungan terperinci Bolehkah Anda Mencontohi Warisan Anotasi untuk Antara Muka dan Kaedah Menggunakan AspectJ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!