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

    [java]problemi con classloading dinamico

    esempio di come si carica dinamicamente una classe con il rispettivo oggetto e ci si chiama un metodo appartenente alla classe caricata,stampando il risultato su schermo

    File f = new File("/Users/marcod/tmp/");
    URL[] url = {f.toURL()};
    ClassLoader cl = new URLClassLoader(url);
    Class c = cl.loadClass("Uffa");
    System.out.println("Classe caricata");
    Object o = c.newInstance();
    Compute co = (Compute) o;
    System.out.println("co(12,23)="+co.compute(12,23)) ;


    nel caso il costruttore abbia pero' dei parametri,quindi in questo caso se Compute fosse stato qualcosa tipo Compute(int i),come potrei fare per caricarlo dinamicamente dato che il cast da Object a Compute non me lo permette?

    spero mi possiate aiutare,grazie mille nicholas

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java]problemi con classloading dinamico

    Originariamente inviato da nikolads
    nel caso il costruttore abbia pero' dei parametri,quindi in questo caso se Compute fosse stato qualcosa tipo Compute(int i),come potrei fare per caricarlo dinamicamente dato che il cast da Object a Compute non me lo permette?
    Devi usare il metodo getConstructor() di Class passando i tipi dei parametri del costruttore, quindi ottieni un oggetto Constructor e alla fine istanzi l'oggetto chiamando newInstance() passando gli argomenti per il costruttore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    File f = new File("~/proveservfarm/eseguiclasse/");
    try {
    URL[] url = {f.toURL()};
    ClassLoader cl = new URLClassLoader(url);
    Class c = cl.loadClass("Inc");
    System.out.println("Classe caricata");

    Class[] paramType = new Class[1];
    paramType[0] = int.class;
    Constructor o = c.getConstructor(paramType);

    int [] dati = new int[1];
    dati [0] = 12;//il metodo exec di Inc.class prende un array di int come parametro,incrementa di uno e restituisce il risultato,in questo caso l'array e' di un solo elemento

    Inc co = (Inc) o.newInstance(13);

    System.out.println("co(12) = "+co.exec(dati));

    credo di aver fatto bene per la creazione dell'istanza,mi compila,ma quando lo faccio girare mi stampa a video solo la prima stringa("Classe Caricata") e si blocca li',senza nemmeno riportare eccezioni non fa nient'altro,senza eccezioni a runtime riesco ancora meno a capire dove possa essere il problema..?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nikolads
    Class[] paramType = new Class[1];
    paramType[0] = int.class;
    Constructor o = c.getConstructor(paramType);
    Questa parte mi sembra ok, anche se io avrei preferito:

    Class[] paramType = { int.class };

    Originariamente inviato da nikolads
    int [] dati = new int[1];
    dati [0] = 12;
    Inc co = (Inc) o.newInstance(13);
    Questa parte no, non mi sembra corretta. newInstance() di Constructor si aspetta un array di Object. Quindi:

    Object[] args = { new Integer(13) };
    Inc co = (Inc) o.newInstance(args);

    Nota che ci pensa lui a fare l'unwrapping per i parametri di tipo primitivo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    it's alive!!!!!!!!!

    grazie ancora,alla prossima!

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.