12 berichten aan het bekijken - 1 tot 12 (van in totaal 12)
  • Q:
    Bijdrager
    MacApp

    Java: Variabele classname

    Ik zou graag willen weten of er een mogelijk is voor een variabele klassenaam in Java. In PHP is het simpel op de lossen op de onderstaande manier.[code:1:f7059cad9f]$klasse = new $naam();[/code:1:f7059cad9f]
    Maar hoe zit dit in Java?

    Bijdrager
    leaf

    volgens mij zo iets:

    [code:1:e69e35c032]

    class boom {

    $tak = "1"

    }

    boom();

    [/code:1:e69e35c032]
    http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html :wink:

    Bijdrager
    MacApp

    Nee, dat bedoel ik niet. De klassenaam moet variabel zijn. Misschien verduidelijk dit het. Alle objecten in de applicatie moeten aangeroepen worden via deze klasse.
    [code:1:bd63f602fd]package oxchangedesktop.Register;

    import java.util.ArrayList;
    import oxchangedesktop.Objecten.*;

    public class Register {
    private static ArrayList objects = new ArrayList();
    private static Register instance = null;

    private Register(){ }

    public static Register buildRegister()
    {
    if(Register.instance == null)
    {
    Register.instance = new Register();
    }
    return Register.instance;
    }

    public void newObject(String name)
    {
    Test test = new Test();
    Register.objects.add(0,test);
    }

    public Object getObject(int id)
    {
    return Register.objects.get(0);
    }

    public String getVersion()
    {
    return "OxChange v0.01";
    }

    public Object clone() throws CloneNotSupportedException {
    throw new CloneNotSupportedException();
    }
    }
    [/code:1:bd63f602fd]

    Bijdrager
    Pieterr
    Bijdrager
    basiel

    waarom wil je een klasse naam variabel hebben?

    In java is alles een subclass van object en kan je dus in elke collectie gelijk welk object steken. Als je even uitlegt waarom je het nodig hebt dan kan ik je misschien helpen.

    Bijdrager
    MacApp

    Ik wil al mijn geopende objecten centraal opslaan in een soort register. Een deel van de code van dit register staat hierboven gepost. Eigenlijk zodat ik in elke klasse bij alle bestaande objecten kan. Als ik dus een object aan wil maken via Register.newObject(‘test’), moet hij dus een object test aanmaken die in test.class gedefinieerd staat. Dit object moet ie dan meteen in een ArrayList zetten.

    Uiteindelijk moet alles een client -> server contactenboek worden.:D

    Bijdrager
    Pieterr

    Wat jij wilt, kan met “loadClass”.
    http://java.sun.com/docs/books/tutorial/ext/basics/load.html
    Er moet dan wel een test.class bestaan.

    Bijdrager
    basiel

    Dan moet je gewoon reflectie gebruiken. Zoeken op java en reflection.

    Een kort voorbeeld

    [code:1:426f3676d8]public void newObject(String name){
    Class c = Class.forName(name);
    Object object = c.newInstance();
    Register.objects.add(object);
    }[/code:1:426f3676d8]

    Je zal wel nog wat exceptions moeten catchen maar dat kan je zelf wel ontdekken.

    Tevens zou ik een HashMap in plaats van een arrayList gebruiken om je objecten in te storen zodat je ze direct via de classname kan opvragen.

    Veel plezier met je java project.

    Basiel

    Bijdrager
    MacApp

    Oke, ik ga d’r zo even mee aan de gang. Bedankt iedereen voor de bijdragen! Ik laat wel weten of het gelukt is!

    Edit: Oke, hij slaat zijn objecten netjes op. Ze zijn aan te roepen, alleen doe ik waarschijnlijk iets fout. Ik wil iets hebben als het onderstaande. In PHP gebruik ik doe ik het ook altijd op deze manier en het werkt perfect. Alleen Java is net was lastiger. (returnTest() is gewoon een simpele string die gereturned wordt)
    [code:1:c42e146ae2]System.out.println(register1.getObject("Test").returnTest());[/code:1:c42e146ae2]

    Zelf denk ik het te maken heeft met de “return-soort” van mijn getObject() class. Deze heb ik ook al naar Test veranderd maar dan werkt hij helemaal niet. Zou iemand mij een stap(je) in de goede richting kunnen helpen? Nogmaals, dank!:D
    [code:1:c42e146ae2]import java.util.HashMap;

    public class Register {
    private static HashMap objects = new HashMap();
    private static Register instance = null;

    private Register(){ }

    public static Register buildRegister()
    {
    if(Register.instance == null)
    {
    Register.instance = new Register();
    }
    return Register.instance;
    }

    public void newObject(String name, String id)
    {
    try{
    Class c = Class.forName(name);
    Object object = c.newInstance();
    Register.objects.put(id,object);
    }
    catch(ClassNotFoundException cnf)
    {
    System.err.println("Caught ClassNotFoundException: " + cnf.getMessage());
    }
    catch(IllegalAccessException iae)
    {
    System.err.println("Caught IllegalAccessException: " + iae.getMessage());
    }
    catch(InstantiationException ie)
    {
    System.err.println("Caught InstantiationException: " + ie.getMessage());
    }
    }

    public Object getObject(String id)
    {
    return Register.objects.get(id);
    }

    public String getVersion()
    {
    return "OxChange v0.01";
    }

    public Object clone() throws CloneNotSupportedException {
    throw new CloneNotSupportedException();
    }
    }[/code:1:c42e146ae2]

    Bijdrager
    basiel

    Zoals al eerder vermeld moet de Class bestaan op je classpath. En moet je de volledige classname geven vb: java.lang.String om een String aan te maken.

    Beste wat je doet is een simpel progje schrijven dat voor je classes de volledige classname geven door

    System.out.println(myClass.className()); te doen.

    Groeten
    Basiel

    Bijdrager
    basiel

    Als je je object wilt gebruiken moet je het ook Casten naar het juiste Type dus:

    System.out.println(((MyClass) register1.getObject(“Test”)).returnTest());

    Als je dit niet doet dan kan je enkel the Object methods uitvoeren en niet die van jouw class

    Bijdrager
    MacApp

    Basiel, het is gelukt! Bedankt man!:D

12 berichten aan het bekijken - 1 tot 12 (van in totaal 12)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.