Avatar billede Droa Seniormester
18. juni 2013 - 18:59 Der er 12 kommentarer og
1 løsning

Brug af annotations

Hej Eksperter
Så jeg er igang med at lære at bruge Java annotations, i praksis.

Og det gør jeg ved et Projekt jeg har, i at omskrive noget af mit VB.NET kode, til Java kode.. jeg har ikke brugt .NET attributter, da jeg gik lidt død i at forstå dem.

så jeg tænkte jeg først ville lære at bruge Annotations i Java, siden de næsten bruger samme ord for det meste.

Mit Projekt er en Client, til et fjernlog-system.

Den har 988 forskellige typer pakker.

Jeg har en klasse for hver type pakke, extended fra en meget Bred klasse, som har et Interface tilsluttet.

Package(0-987)<-AbstractPackage<-IPackage

alle pakker har deres egen måde at genkende deres byte-array, som gjorde hele projektet specielt svært.

Jeg tænker at gøre det samme i Java, nu hvor jeg har identificeret de fleste pakkers sammenkædning, er sværheden os overstået, da jeg har brugt næsten 1 månede alene på at reverse engineer alle pakker, da Protocollen ikke har nogen dokumentation, eller køre efter nogen standarter.

efter hvad jeg kan se, ville annotations være perfekte til at tilføje en måde at lave mine Package's klasser mere Meta. og jeg overvejer at begynde at bruge det mere, dog er den dokumentation jeg har fundet på annotations meget begrænset.
http://www.codeproject.com/Articles/272736/Understanding-Annotations-in-Java

Som mest bare fortæller jeg kan bruge det til at undlade løse variabler i mine classer, og lade min compiler bruge tid på dem.

Denne kode er min "legekode" jeg har vel ikke misforstået brugen af annotations?


Serve.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package serve;

/**
*
* @author arbejde
*/
public class Serve {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {
        IPackage pkg = new Package188();
        pkg.Debug();
    }
}


IPackage.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package serve;

/**
*
* @author arbejde
*/
public interface IPackage {
   
    public Integer getPackageNumber(); //Package Number
    public Integer getPackageInfo(); //Info for PackageType
    public Integer getPackageType(); //Package Type in a integer number
    public String getMessage(); //Getting Readable Message
    public Integer getSize(); //Getting size of Package
    public Object[] getOptions(); //Getting additional Objects
    public void Debug();
}


AbstractPackage.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package serve;

import java.lang.annotation.Annotation;

/**
*
* @author arbejde
*/
public abstract class AbstractPackage implements IPackage{

   
    public AbstractPackage() {
       
    }
   
    public abstract void ReadData(byte[] bytes);
   
    @Override
    public Integer getPackageNumber() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Integer getPackageInfo() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Integer getPackageType() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String getMessage() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Integer getSize() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public Object[] getOptions() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
   
    protected PackageType getMeta(){
        Class c = this.getClass();
        return (PackageType)c.getAnnotation(PackageType.class);
    }
}


PackageType.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package serve;

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

/**
*
* @author arbejde
*/

@Retention(RetentionPolicy.RUNTIME)
public @interface PackageType {
    public String name() default "Unknown";
    public int number() default 0;
    public int[] version() default {1,0,0};
}


Package188.java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package serve;

/**
*
* @author arbejde
*/
@PackageType(name = "CallEventPackage",number = 188,version = {1,0,2})
public class Package188 extends AbstractPackage{

    @Override
    public void ReadData(byte[] bytes) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
   
    public void Debug(){
        PackageType pt = getMeta();
        System.out.println(pt.name());
    }
}
Avatar billede arne_v Ekspert
18. juni 2013 - 20:26 #1
Nu ved jeg jo at du har kigget lidt paa NRecord.

Har du ogsaa kigget paa Record?

http://www.vajhoej.dk/arne/opensource/record/
Avatar billede arne_v Ekspert
18. juni 2013 - 20:26 #2
Skal du laese eller skrive i Java?
Avatar billede Droa Seniormester
18. juni 2013 - 21:13 #3
Jeg har kigget meget på både nrecord og record, det er det der gjorde mig meget nysgerrig i både annotations, og byte udpakning.

Men siden jeg er den type der vil lære og forstå det jeg laver, er jeg mere til at lave det selv :)

Mit forrige project hvor du brugte tid på at opdatere din nrecord til 1.1, endte det desværre os med at jeg ikke bruge dit bibliotek, men istedet brugte den som inspiration til min egen, hvor jeg ikke brugte Attributter.. men uden hjælp fra nrecord, ville jeg aldrig have fundet nogen let måde, og kun have forvirret mig selv :)

Nu er ideen at udfordre mig selv, til at lære at blive bedre i både Java og .Net.

Problemet er at jeg har det lidt med at tage for meget, i forhold til at bruge min egen kreativitet, hvis jeg bruger for meget til på at bruge referancer fra en andens kildekode.

Det er umiddelbart, grunden jeg ikke har ville lære annotations fra record.

Jeg kan huske da jeg startede med Borland Delphi tilbage i folkeskolen, at jeg bare copy/pasted det hele fra de nyhedsgrupper jeg var medlem af, uden rigtigt at forstå hvad koden gjorde.

Nu ville jeg mere læse som Koden, inden jeg tager den i brug, for at vide hvad den gør.

Jeg forstår nu godt hvad record gør, problemet er nok mest jeg ikke kan replikere den, hvis jeg blev bedt om det.
Avatar billede arne_v Ekspert
18. juni 2013 - 21:33 #4
Hvis vi nu antager at det er runtime annotation og ikke compile time annotation som du er intereseret i.

Du har tydeligvis forstaaet hvordan du definerer din egen annotation og hvordan du klisterer den paa en klasse.

Saa det du mangler er hvordan du bruger de annotations via reflection. Men det er ikke saa svaert.

Record viser hvordan, men vil du gerne se noget andet saa:

http://www.java2s.com/Tutorial/Java/0020__Language/0220__Annotations-Reflection.htm
Avatar billede Droa Seniormester
18. juni 2013 - 21:51 #5
Jeg har ikke helt gennemskuet din record pakke, jeg har endnu ikke fundet ud af hvor dine annotations bliver læst fra, troedet det var StructReader, da den lignede en klasse der ville havde med det af gøre :(
Avatar billede Droa Seniormester
18. juni 2013 - 21:58 #6
åhh.. nu forstår jeg..

Sidder i StructReader og kigger på si og fi variablerne.. de gav pludselig mening for mig :)
Avatar billede arne_v Ekspert
18. juni 2013 - 22:00 #7
For at faa god performance, saa laeser jeg annotations en enkelt gang per klasse og cacher dem.
Avatar billede Droa Seniormester
18. juni 2013 - 22:14 #8
kan det passe det er i StructInfoCache du cacher dem, i

private Map<Class<?>, StructInfo> cache;


hvad gør StructInfo> cache, har aldrig set > blive brugt før
Avatar billede Droa Seniormester
18. juni 2013 - 22:15 #9
har det er mig der missede starten på den

private Map< Class<?>, StructInfo > cache;
Avatar billede Droa Seniormester
18. juni 2013 - 22:50 #10
Jeg tror jeg er ved at forstå record, selvom jeg nok skal bruge nogen timer mere på at læse i StructInfo og derefter Write delen, som jeg ikke engang er kommet til endnu, kan godt se jeg bestemt skal læse mere in på Reflection.
Avatar billede arne_v Ekspert
18. juni 2013 - 23:03 #11
Map< Class<?>, StructInfo > er en map fra Class til StructInfo og ja det er cachen.
Avatar billede Droa Seniormester
19. juni 2013 - 08:50 #12
Ja det var mig der troede >  var en ny form for operator, jeg ikke havde set før, fordi jeg ikke så at det var en åben Type
Avatar billede arne_v Ekspert
30. juli 2013 - 04:40 #13
all set?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester