Soru Bir ek açıklamanın değerini java'da okumak mümkün mü?


bu benim kodum:

@Column(columnName="firstname")


private String firstName;

 @Column(columnName="lastname")
 private String lastName;

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

ek açıklama @Column değerini okumak mümkün mü?sütun adı= "xyz123") başka bir sınıfta mı?


76
2017-11-28 13:16


Menşei




Cevaplar:


Evet, Sütun ek açıklamanız çalışma zamanı korumasına sahipse

@Retention(RetentionPolicy.RUNTIME)
@interface Column {
    ....
}

böyle bir şey yapabilirsin

for (Field f: MyClass.class.getFields()) {
   Column column = f.getAnnotation(Column.class);
   if (column != null)
       System.out.println(column.columnName());
}

90
2017-11-28 13:27



çözümünü beğendim. Nasıl MyClass yerine T gibi kullanmak istediğinizi (Field f: T.class.getFields ()) {Column column = f.getAnnotation (Column.class); eğer (column! = null) System.out.println (column.columnName ()); } - ATHER
Kesinlikle! Ben de bunu anlamaya çalışıyorum. Bir sınıf ismiyle açıkça belirtilmesi gerekmeyen bir ek açıklama işlemcisine sahip olmak istiyorsam ne yapmalıyım? İçerikten almak için yapılabilir mi; 'bu'?? - 5122014009
İkinizin ihtiyacının ne olduğunu anladığımdan emin değilim. Lütfen tam bir örnekle yeni bir soru olarak sorun. İsterseniz buraya bağlayabilirsiniz. - Cephalopod
kullanım Myclass.class.getDeclaredFields() özel alanlar almak - q0re
Benim için çalıştı. Teşekkürler. Ben clsName.getSuperclass (). GetDeclaredFields () kullandım yüzden superclass özel alanları arıyordum - Shashank


Tabiki öyle. İşte örnek bir açıklama:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {

    String testText();
}

Ve örnek açıklamalı bir yöntem:

class TestClass {

    @TestAnnotation(testText="zyx")
    public void doSomething() {}
}

Ve testText'in değerini basan başka bir sınıfta örnek bir yöntem:

Method[] methods = TestClass.class.getMethods();
for (Method m : methods) {
    if (m.isAnnotationPresent(TestAnnotation.class)) {
        TestAnnotation ta = m.getAnnotation(TestAnnotation.class);
        System.out.println(ta.testText());
    }
}

Sizinki gibi alan açıklamaları için pek farklı değil.

Cheerz!


67
2017-11-28 13:30



vay çok güzel! Basit örnek için teşekkürler. İşlemi adım adım açık bir şekilde göstermektedir. - Dan Torrey
Ek açıklamaların değerlerini alma sürecinin gerçekten iyi bir açıklaması. - Arlind


Bunu hiç yapmadım ama görünüyor yansıma bunu sağlar. Field bir AnnotatedElement ve böylece var getAnnotation. Bu sayfa bir örneği vardır (aşağıda kopyalanmıştır); ek açıklama sınıfını biliyorsanız ve ek açıklama ilkesi çalışma zamanında açıklamayı koruyorsa oldukça basittir. Doğal olarak, saklama politikası ek açıklamaları çalışma zamanında tutmazsa, çalışma zamanında sorgulayamazsınız.

O zamandan beri silinmiş bir cevap (?) İçin yararlı bir bağlantı sağladı bir ek açıklamalar öğretici yararlı bulabileceğiniz; Bağlantıyı buraya kopyaladım, böylece insanlar bunu kullanabilir.

Dan örnek bu sayfa:

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
  String str();

  int val();
}

class Meta {
  @MyAnno(str = "Two Parameters", val = 19)
  public static void myMeth(String str, int i) {
    Meta ob = new Meta();

    try {
      Class c = ob.getClass();

      Method m = c.getMethod("myMeth", String.class, int.class);

      MyAnno anno = m.getAnnotation(MyAnno.class);

      System.out.println(anno.str() + " " + anno.val());
    } catch (NoSuchMethodException exc) {
      System.out.println("Method Not Found.");
    }
  }

  public static void main(String args[]) {
    myMeth("test", 10);
  }
}

19
2017-11-28 13:23





Şimdiye kadar verilen tüm cevaplar mükemmel bir şekilde geçerli olsa da, aynı zamanda akılda tutulmalıdır. google yansımalar kütüphanesi ek açıklama taramasına daha genel ve kolay bir yaklaşım için, ör.

 Reflections reflections = new Reflections("my.project.prefix");

 Set<Field> ids = reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);

4
2018-02-05 08:34





@Cephalopod'un cevabına uygun olarak, bir listede tüm sütun adlarını görmek isterseniz bu oneliner'ı kullanabilirsiniz:

List<String> columns = 
        Arrays.asList(MyClass.class.getFields())
              .stream()
              .filter(f -> f.getAnnotation(Column.class)!=null)
              .map(f -> f.getAnnotation(Column.class).columnName())
              .collect(Collectors.toList());

3
2018-04-18 20:00



Objects.nonNull Java 8'i tam olarak kucaklamak :) .filter (f -> nonNull (f.getAnnotation (Column.class))) - dehumanizer


Genel tipler de kullanabilirsiniz, benim durumumda, aşağıdaki gibi bir şey yapmadan önce söylediğiniz her şeyi hesaba katarak:

public class SomeTypeManager<T> {

    public SomeTypeManager(T someGeneric) {

        //That's how you can achieve all previously said, with generic types.
        Annotation[] an = someGeneric.getClass().getAnnotations();

    }

}

Unutmayın ki, bu% 100'e eşit olmayacaktır. SomeClass.class.get (...) ();

Ama hile yapabilir ...


2
2018-05-12 16:51





Ortak durumda var özel alanlar için erişim, bu yüzden kullanamazsınız getFields yansımasıyla. Bunun yerine kullanmalısınız getDeclaredFields

Bu nedenle, öncelikle, Sütun ek açıklamasının çalışma zamanı korunmasına sahip olup olmadığını bilmelisiniz:

@Retention(RetentionPolicy.RUNTIME)
@interface Column {
}

Bundan sonra böyle bir şey yapabilirsiniz:

for (Field f: MyClass.class.getDeclaredFields()) {
   Column column = f.getAnnotation(Column.class);
       // ...
}

Açıkçası, alanla bir şeyler yapmak istersiniz - açıklama değerini kullanarak yeni bir değer belirleyin:

Column annotation = f.getAnnotation(Column.class);
if (annotation != null) {
    new PropertyDescriptor(f.getName(), Column.class).getWriteMethod().invoke(
        object,
        myCoolProcessing(
            annotation.value()
        )
    );
}

Yani, tam kod şöyle görünebilir:

for (Field f : MyClass.class.getDeclaredFields()) {
    Column annotation = f.getAnnotation(Column.class);
    if (annotation != null)
        new PropertyDescriptor(f.getName(), Column.class).getWriteMethod().invoke(
                object,
                myCoolProcessing(
                        annotation.value()
                )
        );
}

1
2017-10-19 07:12