Article View: es.comp.lenguajes.java
Article #27554Re: Cargar clases
From: Robert Dodier
Date: Fri, 28 Aug 1998 00:00
Date: Fri, 28 Aug 1998 00:00
124 lines
5256 bytes
5256 bytes
In article <35E3D1BC.AB7BDF51@tid.es>, Javier Rodriguez <jrs53@tid.es> wrote:
> Quiero hacer una aplicaci�n que pasandole la direccion de un applet
> te traiga todas las classes que usa ese applet pero tengo un problema.
> Por ejemplo si el applet es http://www.web.es/MiApplet.class. �Como
> puedo cargar esa clase y copiarla en mi disco?
Si entiendo bien el problema, quieres iniciar un programa por solo
el nombre de la clase primero y no por una pagina html que contenga
un tag <applet>.
Creo que no debes copiar la clase al tuyo disco -- es mejor que la
trasmite solo cuando se la necesita. En este modo siempre ejecuta la
ultima version del programa, y tienes que almacenar solo una copia
(en solo una maquina). Por eso necesitas un classloader ("cargaclases",
quizas? :) que obtiene la clase a traves de la red en la hora que
la necesitas. Por ejemplo el RMIClassLoader funciona asi.
He puesto abajo un breve programa que carga un clase a traves de la red
y ejecuta el metodo "main". Por eso sirve bien para applicacions, pero
lo puedes modificar para applets, creo yo. El NullSecurityManager
(dirigente de seguridad nulo) previene SecurityExceptions -- el
RMISecurityManager no permite muchos operaciones que una applicacion
quiere hacer. Quizas debas reemplacer el NullSecurityManager con
RMISecurityManager porque vas a ejecutar applets y no applicaciones.
Nota bien el "/" al termino del url en el programa abajo.
Tambien el classname (nombre de la clase) no contiene ".class".
Hope this helps,
Robert Dodier
----------------- RunApplication.java -----------------
import java.lang.reflect.*;
import java.io.*;
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;
import java.util.*;
public class RunApplication
{
public static void main( String[] args )
{
String url = "http://xxx.yyy.zzz/~fulano/java/", classname = "AlgunaClase";
Vector app_args_vec = new Vector();
for ( int i = 0; i < args.length; i++ )
{
switch ( args[i].charAt(1) )
{
case 'u': url = args[++i]; break;
case 'c': classname = args[++i]; break;
case 'a': app_args_vec.addElement( args[++i] ); break;
}
}
System.err.println( "RunApplication: url: "+url+", classname: "+classname );
String[] app_args = new String[ app_args_vec.size() ];
app_args_vec.copyInto( app_args );
try
{
System.setSecurityManager( new NullSecurityManager() );
Class c = RMIClassLoader.loadClass( new URL(url), classname );
Object o = c.newInstance();
invokeMain (o, app_args );
}
catch (Exception e) { e.printStackTrace(); }
System.exit(0);
}
public static void invokeMain (Object o, String[] args)
{
Class c = o.getClass();
String name = c.getName();
try
{
Method m = c.getMethod ("main", new Class[] {String[].class} );
try { m.invoke (o, new Object[] { args }); }
catch (Exception e) { e.printStackTrace(); }
}
catch (NoSuchMethodException e) { e.printStackTrace(); }
}
}
class NullSecurityManager extends SecurityManager {
public void checkCreateClassLoader() { }
public void checkAccess(Thread g) { }
public void checkAccess(ThreadGroup g) { }
public void checkExit(int status) { }
public void checkExec(String cmd) { }
public void checkLink(String lib) { }
public void checkRead(FileDescriptor fd) { }
public void checkRead(String file) { }
public void checkRead(String file, Object context) { }
public void checkWrite(FileDescriptor fd) { }
public void checkWrite(String file) { }
public void checkDelete(String file) { }
public void checkConnect(String host, int port) { }
public void checkConnect(String host, int port, Object context) { }
public void checkListen(int port) { }
public void checkAccept(String host, int port) { }
public void checkMulticast(InetAddress maddr) { }
public void checkMulticast(InetAddress maddr, byte ttl) { }
public void checkPropertiesAccess() { }
public void checkPropertyAccess(String key) { }
public void checkPropertyAccess(String key, String def) { }
public boolean checkTopLevelWindow(Object window) { return true; }
public void checkPrintJobAccess() { }
public void checkSystemClipboardAccess() { }
public void checkAwtEventQueueAccess() { }
public void checkPackageAccess(String pkg) { }
public void checkPackageDefinition(String pkg) { }
public void checkSetFactory() { }
public void checkMemberAccess(Class clazz, int which) { }
public void checkSecurityAccess(String provider) { }
}
--
``I'm not too worried about MS coopting Linux. MS is Klingons;
Linux is tribbles. The tribbles always win in the end..... and
they have a LOT more fun!'' -- Craig Goodrich
Technical Details
Message-ID:
<6s6dto$8uv@lace.colorado.edu>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<35E3D1BC.AB7BDF51@tid.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: 1116f3,bb7ed4d824a5d9c6 X-Google-Attributes: gid1116f3,public From: dodier@Colorado.EDU (Robert Dodier) Subject: Re: Cargar clases Date: 1998/08/28 Message-ID: <6s6dto$8uv@lace.colorado.edu> X-Deja-AN: 385708840 References: <35E3D1BC.AB7BDF51@tid.es> Organization: University of Colorado, Boulder NNTP-Posting-User: dodier Newsgroups: es.comp.lenguajes.java