Newsgroup: it.comp.java
Titolo: Caricare una classe e instanziarne un oggetto..

salve sto tentando di caricare una classe e tutto sembra funzionare
fino a quando cerco di instanziare un oggetto..
io lavoro cosi':
 File f = new File("workspace/");
                Class  c = null;
		 try {
			 URL[] url = {f.toURL()};
			 ClassLoader cl = new URLClassLoader(url);
			 c = cl.loadClass(nomeClasse);//caricamento
}
e fino a qui non ho problemi...
poi quando faccio:
	        Object o= null;
		Compute co = null;
		try {
*           		o = c.newInstance();//istanza della classe c
			co = (Compute)o;//interfaccia implementata da c
		} catch (Exception e) {}
mi da errore sulla riga *, non capisco perche' dato che la classe me
l'aveva creata senza problemi..
Grazie mille!!

 l'aveva creata senza problemi..
Vedo due try ma un solo catch ...


effetto del copia/incolla ;)

 effetto del copia/incolla ;)
Che errore ti da esattamente ?

> Che errore ti da esattamente ?
la classe che viene caricata si chiama Somma. Questo e' l'errore:
java.lang.InstantiationException: Somma
        at java.lang.Class.newInstance0(Class.java:335)
        at java.lang.Class.newInstance(Class.java:303)
        at serverfarm.RemoteImpl.risultato(RemoteImpl.java:149)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at
sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
        at sun.rmi.transport.Transport$1.run(Transport.java:153)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
        at
sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:
460)
        at sun.rmi.transport.tcp.TCPTransport
$ConnectionHandler.run(TCPTransport.java:701)
        at java.lang.Thread.run(Thread.java:595)

 cut
se ho ben capito quel che devi fare credo ti basti una classe del genere:
public class MyClassLoader extends ClassLoader {
    public Class<?> loadClass(String className)
        throws ClassNotFoundException {
        Class result;
        try {
            result = super.findSystemClass(className);
            return result;
        } catch (ClassNotFoundException e) {
            return null;
        }
    }
}
da chiamare così
MyClassLoader classLoader = new MyClassLoader() ;
		Object obj = null;
		try {
			obj = (classLoader.loadClass
(classname)).newInstance() ;
		} catch (Exception e ) ...
e poi usi o come vuoi :)

 writes:
E> la classe che viene caricata si chiama Somma. Questo e' l'errore:
E> java.lang.InstantiationException: Somma
Thrown  when an application  tries to  create an  instance of  a class
using the newInstance  method in class Class, but  the specified class
object  cannot be instantiated  because it  is an  interface or  is an
abstract class.
(da 
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/InstantiationException.html
)
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software
A Cesare avrei detto di scrivermi a 
fn...@rat.vg

 )
E' quello che non capisco.. la mi classe Somma è una classe che fa
delle operazioni, e che implementa un'interfaccia...
       public class Somma implements Compute {
       long msecs = 0L;
       public Somma(int secs) {msecs = secs * 1000L; }
       public int exec(int ... in) {
       try {
       Thread.sleep(msecs);
       } catch (InterruptedException e) {}
       return(in[0]+in[1]);
       }
       }
quindi non mi pare che sia una classe astratta... o sbaglio?

 quindi non mi pare che sia una classe astratta... o sbaglio?
No, pero' manca il costruttore di default.
Ciao
Mirko

> No, pero' manca il costruttore di default.
Ma scusa
          public Somma(int secs)  {msecs = secs * 1000L; }
non è il costruttore?

 reflection.
e come dovrei fare? non ho mai lavorato con la reflection...

 
non ti complicare la vita..
fai public Somma() tanto secs ti serviva solo per la sleep
e tantovale che secs te lo ricrei con un Math.random all'interno del metodo
al danelutto va benissimo lo stesso =)