Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Trattamento di informazioni sul tipo di classe in un database

    Ciao a tutti,
    devo costruire un piccolo database MySql, costituito da una semplice tabella che indica come rappresentare, dal punto di vista grafico, elementi di grafici.

    Per intenderci, per un elemento nodo di un albero rappresentato nella configurazione padre-figlio, devo indicare se questo viene raffigurato con un cerchio o un rettangolo.
    In tal caso dovrò immagazzinare nel database un'indicazione della classe Java che rappresenta il cerchio, ovvero java.awt.Ellipse2D, oppure il rettangolo, ovvero java.awt.Rectangle2D.

    In che modo posso memorizzare questa informazione? E' possibile memorizzare una stringa che indichi la classe da usare. Tipo:

    String a = "java.awt.Ellipse2D"

    Infine, è possibile, una volta recuperata questa stringa, instanziare la corrispondente classe?

    Grazie mille,
    SonOfTheLand

  2. #2
    Credo di aver trovato una strada per la risoluzione del mio problema.
    Sto usando la classe "Class" di Java, che mi permette di creare una istanza di classe specifica a partire dal nome della classe passato come String.
    Ad esempio:

    String myShape = "java.awt.geom.Rectangle2D";
    Class t = new Class.forName(myShape);

    Ora, prima di passare al database, il mio problema è quello di INSTANZIARE EFFETTIVAMENTE
    l'oggetto della classe. Ad esempio:

    new Rectangle2D.Double(b - 1, b - 1, d.width - b, d.height - b))

    gli devo cioè passare dei parametri.

    COME POSSO FARE??

    Aiuto.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da sonoftheland
    gli devo cioè passare dei parametri.

    COME POSSO FARE??
    Se devi passare degli argomenti al costruttore devi:
    a) Dal Class ottenere un Constructor, vedi getConstructor() a cui devi passare dei Class che sono i tipi dei parametri.
    b) Invocare il costruttore usando newInstance() sul Constructor. Devi passare degli Object che sono gli argomenti.

    Nota: nella ricerca del costruttore devi passare il Class esatto, se un parametro è int, devi passare int.class. Quando invochi newInstance() devi però passare sempre oggetti e nel caso di int devi passare un Integer (oppure un Byte, Char o Short ... perché newInstance() "unwrappa" l'oggetto wrapper e poi applica le conversioni che si applicano normalmente nel contesto della invocazione dei metodi).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Ok, grazie andbin.
    Nel frattempo, sfogliando l'api doc, ero riuscito a trovare anch'io il metodo getConstructor, e stavo effettivamente provando ad usarlo.
    Ti riporto il codice che ho scritto:

    try
    {
    String shape = "java.awt.geom.Rectangle2D.Double";
    System.out.println("Provo a caricare la classe " +
    "" + shape);
    Class sh = Class.forName(shape);
    java.lang.reflect.Constructor constructor =
    sh.getConstructor(new Class[]
    {double.class, double.class, double.class, double.class});
    g2.draw((Shape)constructor.newInstance(
    b - 1, b - 1, d.width - b, d.height - b));
    }
    catch (LinkageError err) {
    System.out.println (" LINKAGE ERROR ");
    System.out.println(" " + err.getMessage ());
    }

    catch (Throwable trow) {
    trow.printStackTrace ();
    }

    (Spero che il try catch sia corretto).
    Il problema è che non trova Ellipse2D.Double, ma quando cancello Double e cerco per Ellipse2D me la da.
    Ecco infatti l'eccezione con Ellipse2D.Double:



    Provo a caricare la classe java.awt.geom.Rectangle2D.Double java.lang.ClassNotFoundException: java.awt.geom.Rectangle2D.Double
    at java.net.URLClassLoader$1.run(URLClassLoader.java: 200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.j ava:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:3 07)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launche r.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:2 52)
    at java.lang.ClassLoader.loadClassInternal(ClassLoade r.java:320)
    at java.lang.Class.forName0(Native Method) .......................



    (ho riportato solo la prima parte dell'eccezione...)

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da sonoftheland
    String shape = "java.awt.geom.Rectangle2D.Double";
    Eh eh .... già ... ma Double è una "nested" class di Rectangle2D!!!

    Quindi:
    "java.awt.geom.Rectangle2D$Double"
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Questi sono i risultati di avere a che fare con 2500 righe di codice!!

    Ecco perchè la peer review è una tecnica di lavoro sacrosanta!

    Grazie mille, Andbin

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da sonoftheland
    Questi sono i risultati di avere a che fare con 2500 righe di codice!!
    No .... solo questione di sapere esattamente cosa sono inner e nested class....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.