Avatar billede themepark Nybegynder
02. december 2005 - 22:03 Der er 12 kommentarer og
2 løsninger

Brug af konstanter ud fra bruger input

Indrømmet, kryptisk titel, men mit problem er svært at forklare. Derfor har jeg lavet følgende 3 klasser til at illustrere det.

class class1 {
    public static void main(String[] args) {
        char Bogstav = args[0].toUpperCase().charAt(0);
        if ('A' <= Bogstav && Bogstav <= 'C') {
            System.out.println(class2.A.getField());
        }
    }
}

class class2 {
    public static class3 A = new class3("A");
    public static class3 B = new class3("B");
    public static class3 C = new class3("C");
}

class class3 {
    private String field;

    public class3(String myString) {
        field = myString;
    }

    public String getField() {
        return field;
    }
}

Problemet ligger i class2.A.getField(). Jeg vil gerne kunne bruge variablen A, B eller C afhængigt af brugerinputtet.

Og ja, jeg kunne godt lave en if-else sætning og tjekke for alle 3 muligheder, men som sagt er dette blot en test, jeg har mange flere variabler i min kode, derfor er det ikke en mulighed.

Jeg har prøvet med getField og getMethod og jeg ved snart ikke hvad, men jeg kan ikke få startet getField() selvom jeg har fået fat i den rigtige variabel. invoke virkede ikke af en eller anden grund jeg ikke lige kan huske.

Derfor vil jeg gerne høre hvordan jeg så kan få fat i den rigtige variabel.
Avatar billede mwl Nybegynder
02. december 2005 - 23:55 #1
Så skal du have fat i noget reflection.
Avatar billede mwl Nybegynder
03. december 2005 - 00:30 #2
Følgende burde løse problemet

String f = null;
try {
  f = ((class2) class2.getClass.getField(Character.toString(Bogstav)).get(null)).getField();
}
catch (Exception e) {
  e.printStackTrace();
}
System.out.println(f);
Avatar billede arne_v Ekspert
03. december 2005 - 06:23 #3
package december;

public class Ref1 {
    public String a;
    public String b;
    public String c;
    public Ref1() {
        a = "I am a";
        b = "I am b";
        c = "I am c";
    }
    public static void main(String[] args) throws Exception {
        Ref1 o = new Ref1();
        System.out.println((String)o.getClass().getField("a").get(o));
        System.out.println((String)o.getClass().getField("b").get(o));
        System.out.println((String)o.getClass().getField("c").get(o));
    }
}
Avatar billede arne_v Ekspert
03. december 2005 - 06:23 #4
package december;

public class Ref2 {
    private String a;
    private String b;
    private String c;
    public Ref2() {
        a = "I am a";
        b = "I am b";
        c = "I am c";
    }
    public static void main(String[] args) throws Exception {
        Ref2 o = new Ref2();
        System.out.println((String)o.getClass().getMethod("getA", new Class[] { }).invoke(o, new Object[] { }));
        System.out.println((String)o.getClass().getMethod("getB", new Class[] { }).invoke(o, new Object[] { }));
        System.out.println((String)o.getClass().getMethod("getC", new Class[] { }).invoke(o, new Object[] { }));
    }
    public String getA() {
        return a;
    }
    public void setA(String a) {
        this.a = a;
    }
    public String getB() {
        return b;
    }
    public void setB(String b) {
        this.b = b;
    }
    public String getC() {
        return c;
    }
    public void setC(String c) {
        this.c = c;
    }
}
Avatar billede touel Nybegynder
04. december 2005 - 14:59 #5
hva er den overordnede forskel mellem dine 2 eksempler arne.... de udskriver det samme ud...
Avatar billede arne_v Ekspert
04. december 2005 - 16:50 #6
ja

den første tilgår fields direkte hvilket ikke er så pænt

den anden bruger get metoder hvilket er pænere
Avatar billede themepark Nybegynder
04. december 2005 - 17:38 #7
Hmm...ja, jeg har været ude i præcis det samme selv, men jeg har udeladt 2 ting kan jeg se :) Jeg har aldrig haft .get() med på .getField()...hvorfor er det nødvendigt? Jeg troede da .getField returnerede selve variablen.

Og så havde jeg også problemer med invoke...jeg kan nu ikke huske hvorfor, nå men jeg vil lige afprøve de eksempler der :)
Avatar billede mwl Nybegynder
04. december 2005 - 17:41 #8
getField() returnerer Field, som er en reference til din reference :)
Avatar billede themepark Nybegynder
04. december 2005 - 18:01 #9
Den returnerer ikke selve feltet? :S
Avatar billede mwl Nybegynder
04. december 2005 - 18:06 #10
Nej, den returnerer et Field objekt, der indeholder oplysninger om det pågældende felt. se http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Field.html og http://java.sun.com/docs/books/tutorial/reflect/
Avatar billede themepark Nybegynder
04. december 2005 - 18:09 #11
Så er det måske også derfor jeg ikke kunne få invoke til at virke...ja ja, jeg må til at læse API'en noget mere grundigt fremover :)
Avatar billede mwl Nybegynder
04. december 2005 - 18:30 #12
Det er bare iorden :D
Avatar billede themepark Nybegynder
04. december 2005 - 19:47 #13
B-E-A-UTIFUL! :D

Begge arne's eksempler virker jo som smurt :) mwl, dit eksempel giver en del fejl, så det har jeg opgivet :p Men hvis arne lige vil smide et svar, så får I begge point :)
Avatar billede arne_v Ekspert
31. december 2005 - 14:17 #14
kommer her
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