Java modyfikowanie adnotacji

Java modyfikowanie adnotacji
L4
  • Rejestracja:około 15 lat
  • Ostatnio:11 miesięcy
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):

Kopiuj
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 ...

edytowany 1x, ostatnio: lukasw44
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 18 godzin
1

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


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
L4
  • Rejestracja:około 15 lat
  • Ostatnio:11 miesięcy
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 :)

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 18 godzin
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?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
L4
  • Rejestracja:około 15 lat
  • Ostatnio:11 miesięcy
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 .

Kopiuj
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ć :)

edytowany 1x, ostatnio: lukasw44
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 18 godzin
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:

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

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

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
L4
  • Rejestracja:około 15 lat
  • Ostatnio:11 miesięcy
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 :

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

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 18 godzin
1

A gdybyś zrobił coś takiego:

Kopiuj
@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;
}

?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
L4
:D widzę że nie tylko ja daje "dupa" jako testowy string hahhaahah . Swoją drogą kiedyś się na tym przejechałem kiedy ktoś czytał logi a tam było : dupa działa , dupa ok. Teraz się pilnuję :)
Wibowit
dupa jest wszędzie :P
L4
  • Rejestracja:około 15 lat
  • Ostatnio:11 miesięcy
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: )

edytowany 3x, ostatnio: lukasw44
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)