Rumah > Java > javaTutorial > teks badan

Bolehkah Anda Mencontohi Warisan Anotasi untuk Antara Muka dan Kaedah Menggunakan AspectJ?

Linda Hamilton
Lepaskan: 2024-10-24 00:13:29
asal
383 orang telah melayarinya

Can You Emulate Annotation Inheritance for Interfaces and Methods Using 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!