annotations

Status
Nicht offen für weitere Antworten.

steff3

Bekanntes Mitglied
ich habe mir alles bei java ist auch eine isel durchgelsen und frage mich wozu?

für mich sind das nur komplizierte kommentare die ich auch mit // erstellen kann
deshalb habe ich wohl das wesentliche nicht nicht erfasst

also wozu sind die wirklich da :?:
 
B

Beni

Gast
Annotations bleiben zur Laufzeit erhalten, Kommentare nicht. Das kann man verwenden, um Code leichter (ohne Interfaces) zu verbinden.

Z.B. benötige ich in einem meiner Projekte verschiedene Methoden, die über eine Scriptsprache angesprochen werden. Man tippt dann "sqrt( 12 )" ein, und eine Methode soll die Wurzel ausrechnen.
Ich kann da entweder ein Interface basteln, mit einer Methode "getName" und "invoke", dann eine Klasse "Sqrt", "Pow", "Sin"... und Objekte dieser Klassen irgendwo registrieren.

Oder ich benutz Annotations, und schreibe lediglich eine einzige Klasse; mit Reflection kann man die Methoden dann extrahieren.
Die Annotation sieht so aus:
Code:
@Retention( RetentionPolicy.RUNTIME )
@Target( ElementType.METHOD )
public @interface Extractable{
    public String namespace();
    public String name();
    public String type();
}

Dann wird sie in einer beliebigen Klasse verwendet:
Code:
public class NativeMath {
    @Extractable( name="pow", namespace="util.math", type="float(float,float)" )
    public Value pow( Machine machine, Value[] values ) throws MachineException{
        return machine.getValues().getFloat( (float)Math.pow( values[0].asFloat(), values[1].asFloat() ));
    }

    @Extractable( name="sqrt", namespace="util.math", type="float(float)" )
    public Value sqrt( Machine machine, Value[] values ) throws MachineException{
      return ...
    }

    ...
}
An einer anderen Stelle...
Code:
Machine machine = ...
extract( new NativeMath(), machine );
...holt es "pow" und "sqrt" aus dem Objekt:
Code:
    public static void extract( Object base, Machine machine ){
        Class clazz = base.getClass();
        
        for( Method method : clazz.getMethods() ){
            Extractable annotation = method.getAnnotation( Extractable.class );
            if( annotation != null ){
                Class[] parameters = method.getParameterTypes();
                
                if( method.getReturnType().equals( Value.class ) && 
                    parameters.length == 2 &&
                    parameters[0].equals( Machine.class ) &&
                    parameters[1].equals( Value[].class ) ){
                    
                    TypeCompiler compiler = new TypeCompiler();
                    Type type = compiler.compile( annotation.type() );
                    
                    machine.addNative( new GlobalIdentifier(
                            type, annotation.name(), annotation.namespace()),
                            new ReflectedNative( base, method ));
                }
            }
        }
    }

JUnit 4 benutzt Annotations um rauszufinden, welche Methoden wie getestet werden müssen (es gibt da die @Test-Annotation).
 
B

Beni

Gast
Nicht wenn man 100 Methoden so implementiert. Dann ist es wesentlich einfacher als z.B. Vererbung, Interfaces, etc...

Noch ein Vorteil von Annotations gegenüber Kommentaren: sie sind typisiert und werden vom Compiler getestet. Da wird ein "int"-Wert auch tatsächlich eine Zahl sein, und nicht plötzlich ein String (was man in Kommentaren ohne Probleme machen kann).
 

byte

Top Contributor
Ein anderes gutes Anwendungsbeispiel für Annotations sind (die neuen) EJBs. Da hat sich durch die Annotations in Version 3.0 einiges vereinfacht gegenüber früheren Versionen.
 

kama

Top Contributor
Hallo,

Annotations sind eine feine Sache. Seit Annotations mach Hibernate richtig spaß ;-)

MfG
Karl Heinz
 

kama

Top Contributor
Hi,

ja genau. Man kann jetzt ein Datenmodell erstellen indem man nur in den Java Klassen entsprechende Annotations macht und daraus kann man dann auch die DDL/DML Scripte erzeugen kann.

MfG
Karl Heinz
 

bronks

Top Contributor
AlArenal hat gesagt.:
... Nur, wenn man sich mit Webanwendungen rumschlagen muss, was ich - glücklicherweise - (in Java) nicht muss. :)
Ich verwende EJB nur noch selten mit Webanwendungen. EJB ist wohl die stärkste Persistenzmaschine für Java überhaupt. Ich bin nur gespannt, ob ich mit der Embeddable die gleiche Performance geboten bekomme, wie auf einem AS.
 

KSG9|sebastian

Top Contributor
Ich hab Hibernate schon in genügend non-Webanwendungen eingesetzt. Wenn man sich an die best-practices hält und diverse kleinere Performancemaßnahmen ergreift ist es recht flott und vor allem sehr komfortabel.
Eventuell noch Spring dazu und alles is wunderbar :D
 

AlArenal

Top Contributor
Ich würde es auch in Client-Anwendungen einsetzen. Problem ist, dass der Tag keine 40 Stunden und die Woche keine 20 Tage hat. Soviele Ideen und keine Zeit, bzw. wenn ich daheim bin, lese ich auch noch gerne, aber kann mich kaum mehr zum Coden aufraffen.

An Ideen mangelt es nun wirklich nicht (auch wenn sie alle etwas mit Eishockey zu tun haben) ;)
 

byte

Top Contributor
Das Phenomen kenn ich. Deswegen bin ich auch jedes Mal verblüfft, wenn Leute aus der Branche offenbar dann auch noch Coden als Hobby haben. Wenn ich von morgens bis abends an der Kiste saß (bei mir derzeit Diplomarbeit), dann bin ich irgendwann froh, wenn ich das Notebook-Display einfach runterklappen kann. :)
 

foobar

Top Contributor
KSG9|sebastian hat gesagt.:
yep, Hibernate war schon immer ne feien Sache, aber mit Annotations wirds richtig schön :)
Dem kann ich mich nur anschließen. Ich habe mich in den letzten paar Wochen zum ersten mal mit Hibernate 3 beschäftigt und finde es sehr viel angenehmer als EJB 2 mit diesen furchtbaren Deployment-Descriptoren. Wenn man mehr als 2 Beans damit verwaltet. blickt man schon nicht mehr durch. Dann noch diese ganzen unnötigen Interfaces. Das ist bei Hibernate 3 mit Annotations alles viel schöner. Hier kannst du einfach eine Java Bean mit Annotations versehen und persistieren. Da kommt Freude auf :)
 

AlArenal

Top Contributor
KSG9|sebastian hat gesagt.:
Ich hab Hibernate schon in genügend non-Webanwendungen eingesetzt. Wenn man sich an die best-practices hält und diverse kleinere Performancemaßnahmen ergreift ist es recht flott und vor allem sehr komfortabel.

Leider hat man mir eben nen Knüppel in die Beine geworfen. Netbeans findet nichts, was er für @Id importieren könnte. Obwohl ich die mit Hibernate Annotations kommende ejb3-persistence.jar als Library im Projekt habe, kennt er auch kein javax.persistence, obwohl das Paket darin ist.

Ideen?
 

foobar

Top Contributor
Hast du auch alle anderen jars die bei Hibernate dabei sind importiert? Also ich habe folgende jars eingebunden:
antlr-2.7.6rc1.jar
asm-attrs.jar
asm.jar
binding-1.1.1.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-lang-2.1.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
ejb3-persistence.jar
hibernate3.jar
hibernate-annotations.jar
hibernate-annotations-src.jar
hibernate-src.jar
jta.jar
log4j-1.2.13.jar

Vielleicht fehlen dir die hibernate-annotations-jars.
 

AlArenal

Top Contributor
antlr-2.7.6.jar
asm-attrs.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
ehcache-1.2.jar
ejb3-persistence.jar
hibernate3.jar
hibernate-annotations.jar
jdbc2_0-stdext.jar
jta.jar
xml-apis.jar

Aber ich kann Alt-Shift-F kloppen wie blöde, der findet nix und weigert sich auch händisch was aus javax.persistence zu importieren. :(

Ah.. moment...

Er macht zwar kein Auto-Completion für javax.p.., aber er schluckt den Import von javax.persistence.* und gibt dann auch Ruhe. Haue ich dennoch nochmal Alt-Shift-F, mault er kurz, dass er nix für Id findet, zeigt aber im Source keinen Fehler. Ein Rebuild zieht er auch anstandslos durch...

Muss wohl ein Bug in NB 5.0 gewesen sein... :(
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben