Java modyfikowanie adnotacji

0

Witam
Ogólnie jak wiadomo adnotacje w javie można pobrać za pomocą np refleksji np field.getAnnotation(Adnotacja.class) i następnie pobrać jej dane itd.

Mam takie 1 ciekawe pytanie bardzo interesuje mnie odpowiedź muszę przyznać:
Jak można w jakiejś tam funkcji (nieważne jakiej) odczytać domyślne wartości danej adnotacji ??

Ja napisałem coś takiego ale nie mogę uwierzyć, że nie istnieje łatwiejsze (piękniejsze rozwiązanie):

Method[] methods = MyAnnotation.class.getDeclaredMethods();
for(Method m : methods){
	if(m.getName().equals("valueA")){
		valueA = (Integer)m.getDefaultValue();
	}
	//mase if :)
	....
}

Ogólnie czy nie istnieje jakiś narzędzie coś a la wrapper dla adnotacji ?? coś jak Integer dla int czy Float dla float itp ??
Takie coś abym miał Klasę która jest odzwierciedleniem pól jakie ma adnotacja które są inicjalizowane domyślnymi wartościami (o ile dane pole w adnotacji ma default) ?? Może ktoś podać jakiś przykład takiego wrappera ??

Ja znalazłem coś takiego
http://www.jakobk.com/2010/09/create-annotation-instances-at-runtime/

ale niestety nie mogę użyć javax.enterprise.util.AnnotationLiteral i nie wiem czy to jest naprawdę to czego ja szukam :/

Ogólnie napisałem sobie takiego wrappera ale zawiera mnóstwo ifów :/ nie sądzę , żeby to było dobre rozwiązanie mojego problemu ...

1

No to modyfikowanie czy odczytywanie? I na co ci to?

0

Czy to ważne na co mi to ? :D

Mam parser który czyta adnotacje jakie ma klasa następnie ich wartości przekazuje do różnych generatorów generatory mogą jednak otrzymywać inne konfiguracje i muszą mieć możliwość ewentualnej modyfikacji danego pola adnotacji.

Nie wiem czy mnie zrozumiałeś . Po prostu mam klasy które pracują na podstawie wartości w danej adnotacji. Jednak inne czynniki wymagają zmiany niektórych wartości. Dlatego potrzebne mi jest coś takiego . Jak patrzyłem po internecie to widać, że coś takiego jest tylko nie mogę znaleźć przykładowego rozwiązania :/

Ale nie chodzi o to tak naprawdę po co mi to. Chodzi mi o otrzymanie jakoby swoistego klona danej adnotacji w postaci klasy. Która ma takie same pola jak dana adnotacja , które są standardowo inicjalizowane domyślnymi wartościami .

mam nadzieję, że mnie zrozumiałeś drogi @Wibowit :)

0

Jakby to miało wyglądać i jakbyś chciał tego użyć? Bo na moje krzywe oko to ci i tak nic nie da.

PS:
Mapa (np HashMapa) nie rozwiąże sprawy?

0

Miał bym opakowaną adnotację w danej klasie. Po pobraniu adnotacji dla danego pola mam automatycznie wrappera.

Teraz trzymam sobie daną adnotację jako obiekt danej klasy (kompozycja), jednak nie mogę modyfikować jej wartości np mając metodę set.

np .

public class N {

	private MyAnnotationConf annotationConf; 
	private Config conf;

	public class N(MyAnnotationConf a, Config conf){
		this.annotation = a; 
		this.conf = conf;
	}

	//tak mogę zrobić mając zwykłą klasę
	public void setConf(int a , long b){
		conf.setA(a);
		conf.setB(b);
	}
	//tak nie zrobie
	public void changeConfig(ing d, long d){
		annotationConf.setA // nie da sie 
	}
}

Rozumiesz już przechowując w ten sposób nie mogę sobie modyfikować ewentualnie.
Szkoda mi to tłumaczyć dokładnie bo kontekst zagadnienia jest dość szeroki . Chodzi o coś innego jak to zrobić a nie po co to mieć :)

0

ZTCW adnotacja to coś niemutowalnego, coś czego wartość jest dostępna w czasie kompilacji, a nie dopiero wykonania. Dlatego modyfikowanie adnotacji nie powinno być w ogóle możliwe. A domyślne wartości w adnotacji to coś jak stałe globalne (statyczne) i to kolejny powód dla którego modyfikacja jest niewskazana.

Może po prostu zrób swoją własną klasę adnotacji i swoją własną klasę opakowującą, tzn np:

class MyAnnotation<T> {
T value;
// akcesory
}

class AnnotatedObject<T, U> {
  T value;
  MyAnnotation<U> annotation;
  // akcesory
}
0

Tylko zastanawia mnie jedna rzecz

dlaczego skoro default value jest statyczną wartością to nie ma możliwości prostego jej odczytania ?

można to zrobić trickiem np poprzez klasę proxy czy np w ten sposób :

Method[] methods = MyAnnotation.class.getDeclaredMethods();
		for(Method m : methods){
			if(m.getName("valueA")){
				m.getDefaultValue();
			}
		}

1

A gdybyś zrobił coś takiego:

@interface Adnotacja {
    public static class A implements Adnotacja {
        final static String parametr1 = "dupa";
        final static int parametr2 = 5;

        public String parametr1() {
            return parametr1;
        }

        public int parametr2() {
            return parametr2;
        }

        public Class<? extends Annotation> annotationType() {
            return null; // nie wiem co tu wpisać :P
        }
    }
    String parametr1() default A.parametr1;
    int parametr2() default A.parametr2;
}

?

0

No muszę Ci przyznać, że ciekawe rozwiązanie masz głowę nie od parady jak to mawiają :)))

trzeba jeszcze dodać modyfikator public do każdego z pola i teraz fajnie się to spisuje :) Dzięki o coś takiego mi m.in chodziło teraz będzie mi łatwiej napisać wrappera: )

1 użytkowników online, w tym zalogowanych: 0, gości: 1