🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.lenguajes.java
Article #27554

Re: Cargar clases

#27554
From: Robert Dodier
Date: Fri, 28 Aug 1998 00:00
124 lines
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-mail
References: <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