Ek Açıklamalar Java'da nasıl ve nerede kullanılır?


218

Ek Açıklamaları kullanabileceğimiz başlıca alanlar nelerdir? Bu özellik XML tabanlı yapılandırmanın yerini alıyor mu?


2
cdb, tamamen ödüller fikrini aldığınızdan emin değilim - burada bir sürü oldukça iyi cevabınız var ve onlardan eksik olanları veya özellikle aradıklarınızı açıklığa kavuşturmadan bir ödül eklediniz. (Bunu burada da yaptınız: stackoverflow.com/questions/1746550/… )
delfuego

5
Tamam, bunun çok eski olduğunu biliyorum, ama @delfuego: OP'ye lütufları yanlış kullandığını söyleyeceksen, onları nasıl doğru kullanacağını açıklayarak takip etmeye yardımcı olabilir .
Pops

Yanıtlar:


308

Açıklamalar olan meta meta nesnelerin diğer tanımlamak için kullanılabilir meta nesneleri . Meta nesneler sınıflar, alanlar ve yöntemlerdir. Bir nesneyi meta nesnesi (örneğin anObj.getClass()) için sormaya içgözlem denir . İçgözlem daha da ileri gidebilir ve bir meta-nesneye ek açıklamalarının ne olduğunu sorabiliriz (örn. aClass.getAnnotations). İçgözlem ve ek açıklamalar yansıma ve meta-programlama olarak adlandırılır .

Bir ek açıklamanın yararlı olması için şu veya bu şekilde yorumlanması gerekir. Ek açıklamalar geliştirme zamanında IDE veya derleyici tarafından veya çalışma zamanında bir çerçeve ile yorumlanabilir.

Ek açıklama işleme çok güçlü bir mekanizmadır ve birçok farklı şekilde kullanılabilir:

  • bir öğenin kısıtlamalarını veya kullanımını tanımlamak için: örn. @Deprecated, @Override, veya@NotNull
  • bir elementin "doğasını" açıklamak için, ör. @Entity, @TestCase, @WebService
  • bir öğenin davranışını tanımlamak için: @Statefull, @Transaction
  • öğenin nasıl işleneceğini açıklamak için: @Column, @XmlElement

Her durumda, öğeyi tanımlamak ve anlamını açıklamak için bir ek açıklama kullanılır .

JDK5'ten önce, şimdi ek açıklamalarla ifade edilen bilgilerin başka bir yerde saklanması gerekiyordu ve XML dosyaları sıklıkla kullanılıyordu. Ancak ek açıklamaları kullanmak daha uygundur, çünkü bunlar Java kodunun kendisine aittir ve bu nedenle manipüle edilmesi XML'den çok daha kolaydır.

Ek açıklamaların kullanımı:

  • Dokümantasyon, örneğin XDoclet
  • Derleme
  • IDE
  • Test çerçevesi, örneğin JUnit
  • IoC konteyneri, örneğin Spring gibi
  • Serileştirme, örneğin XML
  • En boy yönelimli programlama (AOP), örneğin Spring AOP
  • Uygulama sunucuları, örneğin EJB kapsayıcısı, Web Hizmeti
  • Nesne ilişkisel eşleme (ORM), örn. Hazırda Bekleme, JPA
  • ve daha fazlası...

... örneğin nasıl üretileceğini veya yöntemlerini tanımlamak için ek açıklamaları kullanan Lombok projesine bir göz atın .equalshashCode


50

Java'nın ek açıklamaları için birden fazla uygulama vardır. Her şeyden önce, derleyici (veya derleyici uzantıları) tarafından kullanılabilirler. Örneğin Geçersiz kılma ek açıklamasını düşünün :

class Foo {

    @Override public boolean equals(Object other) {
        return ...;
    }
}

Bu aslında Java JDK'da yerleşiktir. Bazı yöntem etmez ki, bunun ile etiketlenmiş ise derleyici bir hata sinyali verecektir olmayan bir taban sınıfından miras bir yöntemini geçersiz kılar. Bu ek açıklama, aslında bir yöntemi geçersiz kılmak istediğiniz, ancak bunu gerçekleştiremediğiniz yaygın hatalardan kaçınmak için yararlı olabilir, çünkü yönteminizde verilen imza, geçersiz kılınan yöntemin imzasıyla eşleşmiyor:

class Foo {

    @Override public boolean equals(Foo other) {  // Compiler signals an error for this one
        return ...;
    }
}

JDK7'den itibaren, herhangi bir türde ek açıklamalara izin verilir. Bu özellik artık NotNull gibi derleyici ek açıklamaları için şu şekilde kullanılabilir :

public void processSomething(@NotNull String text) {
    ...
}

bu da derleyicinin değişkenlerin ve null değerlerin yanlış / kontrolsüz kullanımı konusunda sizi uyarmasını sağlar .

Ek açıklamalar için daha gelişmiş bir başka uygulama, çalışma zamanında yansıma ve ek açıklama işlemeyi içerir. Ek açıklamalardan "XML tabanlı yapılandırmanın yerine geçme" olarak bahsettiğinizde aklınıza takılan şey budur. Bu, gerekli meta verileri ve yapılandırma bilgilerini sağlamak için, örneğin çeşitli çerçeveler ve JCP standartları (kalıcılık, bağımlılık enjeksiyonu, adınız) tarafından kullanılan bir ek açıklama işlemidir.


18

Ek açıklamalar, Java kaynak dosyasına eklenen bir meta veri biçimidir (veriler hakkındaki veriler). Bunlar, büyük ölçüde çerçeveler tarafından istemci kodunun entegrasyonunu basitleştirmek için kullanılır. Kafamın tepesinden birkaç gerçek dünya örneği:

  • JUnit 4 - @TestEk açıklamayı, JUnit koşucusunun çalışmasını istediğiniz her test yöntemine eklersiniz . Ayrıca, test kurulumu ( @Beforeve gibi @BeforeClass) ile ilgili ek ek açıklamalar da vardır . Tüm bunlar, testleri uygun şekilde çalıştıran JUnit koşucusu tarafından işlenir. XML yapılandırmasının yerini aldığını söyleyebilirsiniz, ancak ek açıklamalar bazen daha güçlüdür (örneğin yansımayı kullanabilirler) ve ayrıca referansta bulundukları koda daha yakındır ( @Testek açıklama, test yönteminden hemen önce, bu nedenle amaç bu yöntemin açık olduğu açıktır - dokümantasyon görevi de görür). Diğer yandan XML yapılandırması daha karmaşık olabilir ve ek açıklamalardan çok daha fazla veri içerebilir.

  • Terracotta - ek açıklamaları ve XML yapılandırma dosyalarını kullanır. Örneğin, @Rootek açıklama Terracotta çalışma zamanına ek açıklamalı alanın bir kök olduğunu ve belleğinin VM örnekleri arasında paylaşılması gerektiğini bildirir. XML yapılandırma dosyası, sunucuyu yapılandırmak ve hangi sınıfların aygıt olarak kullanacağını söylemek için kullanılır.

  • Google Guice - bir örnek, bir yapıcıya @Injectuygulandığında Guice çalışma zamanını, tanımlanan enjektörleri temel alarak her bir parametre için değerler aramasını sağlayan ek açıklamadır. @InjectEk açıklama XML yapılandırma dosyalarını kullanarak çoğaltmak için oldukça zor olurdu ve o kadar başvuran yapıcı olan yakınlığı (eğer kurdunuz tüm bağımlılık enjeksiyonları bulmak için büyük bir XML dosyasına aramak zorunda hayal) oldukça faydalıdır.

Umarım size ek açıklamaların farklı çerçevelerde nasıl kullanıldığına dair bir lezzet verdim.


12

Java'daki ek açıklamalar, sınıfları, alanları ve yöntemleri açıklamak için bir yol sağlar. Temel olarak, bir Java kaynak dosyasına eklenen bir meta veri biçimidir, bir programın anlambilimini doğrudan etkileyemezler. Ancak ek açıklamalar Reflection kullanılarak çalışma zamanında okunabilir ve bu işlem Introspection olarak bilinir. Daha sonra sınıfları, alanları veya yöntemleri değiştirmek için kullanılabilir.

Bu özellik, bir programcının bu Kütüphaneler veya SDK'larla çalışmak için yapmadıkça kod miktarını basitleştirmek veya azaltmak için genellikle Kütüphaneler ve SDK'lar (hazırda beklet, JUnit, Spring Framework) tarafından kullanılır. Bu nedenle, Açıklamalar ve Yansıma çalışma el Java.

Ayrıca, bir ek açıklamanın kullanılabilirliğini derleme zamanı veya çalışma zamanı ile sınırlayabiliriz.Aşağıda, özel bir ek açıklama oluşturmanın basit bir örneği

Driver.java

package io.hamzeen;

import java.lang.annotation.Annotation;

public class Driver {

    public static void main(String[] args) {
        Class<TestAlpha> obj = TestAlpha.class;
        if (obj.isAnnotationPresent(IssueInfo.class)) {

            Annotation annotation = obj.getAnnotation(IssueInfo.class);
            IssueInfo testerInfo = (IssueInfo) annotation;

            System.out.printf("%nType: %s", testerInfo.type());
            System.out.printf("%nReporter: %s", testerInfo.reporter());
            System.out.printf("%nCreated On: %s%n%n",
                    testerInfo.created());
        }
    }
}

TestAlpha.java

package io.hamzeen;

import io.hamzeen.IssueInfo;
import io.hamzeen.IssueInfo.Type;

@IssueInfo(type = Type.IMPROVEMENT, reporter = "Hamzeen. H.")
public class TestAlpha {

}

IssueInfo.java

package io.hamzeen;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author Hamzeen. H.
 * @created 10/01/2015
 * 
 * IssueInfo annotation definition
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface IssueInfo {

    public enum Type {
        BUG, IMPROVEMENT, FEATURE
    }

    Type type() default Type.BUG;

    String reporter() default "Vimesh";

    String created() default "10/01/2015";
}

6

XML tabanlı yapılandırmanın yerini alıyor mu?

Tamamen değil, ancak kod yapılarına (JPA eşlemeleri veya İlkbaharda bağımlılık enjeksiyonu gibi) yakından karşılık gelen konfugasyon genellikle ek açıklamalarla değiştirilebilir ve daha sonra genellikle daha az ayrıntılı, sinir bozucu ve acı verici olur. Hemen hemen tüm dikkate değer çerçeveler bu anahtarı yaptı, ancak eski XML yapılandırması genellikle bir seçenek olarak kalıyor.


Sözde ek açıklamalar JSF için faces-config XML dosyasını tamamen ortadan kaldırabilir. Bunu nasıl bulmaya çalışırken bu yazıya rastladı ...
Brian Knoblauch

6

Ek açıklamaların 2 görünümü var

  1. kullanıcı görünümü, çoğu zaman ek açıklamalar bir kısayol gibi çalışır, size bazı tuş vuruşlarını kaydeder veya programınızı daha okunabilir hale getirir

  2. satıcı görünümünde, işlemcinin ek açıklama görünümü daha hafif ağırlıklı 'arayüz'dür, programınız SOMETHING ile karşılaşır, ancak belirli bir arayüzü açıkça "uygular" (burada ek açıklama olarak)

örneğin jpa'da şöyle bir şey tanımlarsınız:

@Entity class Foo {...}

onun yerine

class Foo implements Entity {...}

ikisi de aynı şeyi "Foo bir Entity sınıfıdır"


3

Ek Açıklamalar Nerede Kullanılabilir

Ek açıklamalar bildirimlere uygulanabilir: sınıfların, alanların, yöntemlerin ve diğer program öğelerinin bildirimleri. Bir beyanda kullanıldığında, her ek açıklama genellikle sözleşmeyle kendi satırında görünür.

Java SE 8 Güncellemesi: ek açıklamalar türlerin kullanımına da uygulanabilir. İşte bazı örnekler:

  • Sınıf örneği oluşturma ifadesi:

    yeni @Interned MyObject ();

  • Döküm tipi:

    myString = (@NonNull String) str;

  • cümle uygular:

    sınıf UnmodifiableList @Readonly List <@Readonly T> {...} uygular

  • Atılan istisna beyanı:

    void monitorTemperature () @Kritik Sıcaklık İstisnası atar {...}


2

Hazırda Bekletme gibi çerçeveler çok fazla yapılandırma / eşleme gerektiriyordu Ek Açıklamalar yoğun şekilde kullanıyor.

Hazırda Bekletme Notlarına göz atın


1
Bu teorik olarak soruyu cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
Rohit Gupta

2

JPA (Java EE 5'ten) ek açıklamaların (aşırı) kullanımına mükemmel bir örnektir. Java EE 6 ayrıca RESTful web hizmetleri ve her bir eski eski Servlet API'sı için yeni ek açıklamalar gibi birçok yeni alanda ek açıklamalar sunacaktır.

İşte birkaç kaynak:

Ek açıklamalarla yalnızca devralınacak / devralınacak yapılandırma özellikleri değil, aynı zamanda davranışı kontrol etmek için de kullanılabilir. Java EE 6'nın JAX-RS örneklerinde bunu iyi görüyorsunuz.


1

Sınıflarınıza yöntem, sınıf veya alan düzeyinde ek açıklama eklemek için yararlıdır, bu sınıfla ilgili sınıfla oldukça ilgili olmayan bir şey.

Belirli sınıfları yalnızca test kullanımı olarak işaretlemek için kullanılan kendi ek açıklamalarınız olabilir. Bu sadece dokümantasyon amaçlı olabilir veya bir üretim sürümü adayı derlediğinizde filtreleyerek uygulayabilirsiniz.

Ek açıklamaları, eklenti çerçevesinde olduğu gibi eklentinin adı gibi bazı meta verileri depolamak için kullanabilirsiniz.

Sadece başka bir araç, birçok amacı var.


1

(A) derleyici kontrolü veya (b) kod analizi ile kod hakkında ek bilgiler ekler

**

  • Yerleşik ek açıklamalar şunlardır: 2 tür

**

Tip 1) Java koduna uygulanan ek açıklamalar:

@Override // gives error if signature is wrong while overriding.
Public boolean equals (Object Obj) 

@Deprecated // indicates the deprecated method
Public doSomething()....

@SuppressWarnings() // stops the warnings from printing while compiling.
SuppressWarnings({"unchecked","fallthrough"})

Tip 2) Diğer ek açıklamalara uygulanan ek açıklamalar:

@Retention - Specifies how the marked annotation is storedWhether in code only, compiled into the class, or available at run-time through reflection.

@Documented - Marks another annotation for inclusion in the documentation.

@Target - Marks another annotation to restrict what kind of java elements the annotation may be applied to

@Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).

**

  • Özel Ek Açıklamalar ::

** http://en.wikipedia.org/wiki/Java_annotation#Custom_annotations


DAHA İYİ ANLAYIŞ İÇİN LINK ALTINDA DENEYİN: ÖRNEKLERLE BİRLİKTE ÇIKIN


http://www.javabeat.net/2007/08/annotations-in-java-5-0/


0

Ek açıklamalar harici yapılandırma dosyalarına alternatif olarak kullanılabilir, ancak tam bir yedek olarak kabul edilemez. Ek açıklamaların Hibernate, JPA, EJB 3 ve Java EE'de bulunan hemen hemen tüm teknolojiler gibi yapılandırma dosyalarını değiştirmek için kullanıldığı birçok örnek bulabilirsiniz.

Her neyse, bu her zaman iyi bir seçim değildir. Yapılandırma dosyalarını kullanmanın amacı genellikle kodu uygulamanın çalıştığı ortamın ayrıntılarından ayırmaktır. Bu gibi durumlarda ve çoğunlukla yapılandırma, uygulamayı harici bir sistemin yapısıyla eşleştirmek için kullanıldığında, harici sistemin ayrıntılarını kaynak kodunun içine dahil etmenizi sağladığından ek açıklama, yapılandırma dosyasının yerine geçmez. başvurunuz. Burada harici dosyalar en iyi seçim olarak kabul edilir, aksi takdirde kaynak kodunu değiştirmeniz ve yürütme ortamındaki ilgili bir ayrıntıyı her değiştirdiğinizde yeniden derlemeniz gerekir.

Ek açıklamalar, kaynak kodunu, derleme zamanında ve çalışma zamanında, işleme araçlarını sınıfları ve sınıf yapılarını özel bir şekilde işlemek için yönlendiren ek bilgilerle süslemek için çok daha uygundur. @Overrideve JUnit @Test, diğer cevaplarda ayrıntılı olarak açıklanmış olan bu tür bir kullanım için iyi örneklerdir.

Sonunda kural her zaman aynıdır: Kaynakla değişen şeyleri kaynağın içinde tutun ve kaynaktan bağımsız olarak değişen şeyleri kaynağın dışında tutun.


0

Java EE 5, XML yapılandırması üzerinden ek açıklamaların kullanılmasını destekler. Örneğin, EJB3'te bir EJB yöntemindeki işlem öznitelikleri ek açıklamalar kullanılarak belirtilir. Hatta ek açıklamaları POJO'ları EJB olarak işaretlemek ve belirli yöntemleri bir arayüzün uygulanmasını gerektirmek yerine yaşam döngüsü yöntemleri olarak belirtmek için kullanırlar.


0

Java ek açıklamasının amacı, bilgileri ek açıklamalı program öğesiyle ilişkilendirmektir. Java ek açıklamaları, paket, sınıf (numaralandırmalar dahil), arabirim (ek açıklama türleri dahil), alan, yöntem, biçimsel parametre, yapıcı veya yerel değişken olsun, herhangi bir bildirimde değiştirici olarak kullanılabilir.

Java ek açıklamaları numaralandırma sabitlerinde de kullanılabilir. Bu ek açıklamalar, açıklama ekledikleri numaralandırma sabitinin hemen önüne yerleştirilir. Java ek açıklamaları geleneksel olarak diğer tüm değiştiricilerin önüne yerleştirilir, ancak bu bir gereklilik değildir; diğer değiştiricilerle serbestçe karıştırılabilirler.

Java Ek Açıklamaları hakkında ayrıntılı bilgi edinin .


0

Ek açıklamaları kullanabileceğiniz bazı yerler aşağıdadır.

a. Annotations can be used by compiler to detect errors and suppress warnings
b. Software tools can use annotations to generate code, xml files, documentation etc., For example, Javadoc use annotations while generating java documentation for your class.
c. Runtime processing of the application can be possible via annotations.
d. You can use annotations to describe the constraints (Ex: @Null, @NotNull, @Max, @Min, @Email).
e. Annotations can be used to describe type of an element. Ex: @Entity, @Repository, @Service, @Controller, @RestController, @Resource etc.,
f. Annotation can be used to specify the behaviour. Ex: @Transactional, @Stateful
g. Annotation are used to specify how to process an element. Ex: @Column, @Embeddable, @EmbeddedId
h. Test frameworks like junit and testing use annotations to define test cases (@Test), define test suites (@Suite) etc.,
i. AOP (Aspect Oriented programming) use annotations (@Before, @After, @Around etc.,)
j. ORM tools like Hibernate, Eclipselink use annotations

Ek açıklamalar hakkında daha fazla bilgi için bu bağlantıya başvurabilirsiniz .

Basit test paketi oluşturmak için ek açıklamaların nasıl kullanıldığını görmek için bu bağlantıya başvurabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.