Como Descarregar uma Class

4 respostas
E

Olá sou novo no forum… mas sou programador java a nível intermediario

E para começar estou com um problema que já me acompanha a algum tempo, no site do guj ha um artigo sobre ClassLoader, e a minha dúvida é a seguinte: depois de carregar uma class java como descarrego a mesma??? Existe uma maneira prática de descarregar um class para que seja feito alterações e estas alterações façam efeito em tempo de execução??? :frowning:

Ja procurei vários códigos e tutoriais mas não tive sucesso com nenhum… :?

Se alguém puder me dar uma dica, agradecia… :wink:

4 Respostas

cv1

Hmm… isso ateh que eh possivel, mas eh uma trabalheira tao grande que eu nao sei se vale a pena… pq vc quer fazer isso?

Alias, http://fishbowl.pastiche.org/2004/04/04/cut_with_the_grain :smiley:

E

DEPOIS DE TANTO PROCURAR ENCONTREI!!! :smiley:

Esta class carrega classes e descarrega do cache pronta para alterações e aplica-las em tempo de execução!!!

Obrigado pela dica…

Para crie um diretório chamado “loadDir” e dentro coloque esta class…

public class HelloWorld {

public void sayHello(String Teste) {

System.out.println("Hello World !!! "+ Teste);

}

}

e depois basta colocar estas classes abaixo em um diretório acima e usa-las para acessar a classe acima e boa!!!

Encontrei isto em um site japonês… cacei muito para achar isto mas ai esta… mas tenho ainda um probleminha… :frowning:

Como faço para a class q eu chamo chamar uma outra class dentro de um package??? Só falta isto e fica perfeito… se alguém puder ajudar agradecia…

[ ]'s

Eduardo Fonseca Velasques :wink:

[i]// MAIN CLASS

import java.lang.reflect.*;

public class TestCustomLoadera {

public static void main(String [] args) {

//if(args.length < 2) {

//    System.out.println(“Usage Java CustomClassLoader [code repository] [class to load]”);

//    System.exit(1);

//}

String repository = loadDir;

String classToLoad = HelloWorld;

try {

ClassLoader customLoader = new CustomClassLoader(repository);
loadAndInvoke(customLoader,classToLoad);
        System.out.println("waiting.Hit Enter to continue");
        
        System.in.read();
        
        System.out.println("Reinstantiating the loader.");
        customLoader = new CustomClassLoader(repository);
        loadAndInvoke(customLoader,classToLoad);
        
    }
    catch(Exception ex) {
        System.out.println("Exception raised : " + ex.getMessage());
        ex.printStackTrace();
    }
}

static void loadAndInvoke(ClassLoader customLoader,String helloClass)
throws Exception {
    Class aClass = customLoader.loadClass(helloClass);
    Object ClassesObj = aClass.newInstance();
    try {
        Class[] Parametros = new Class[1];
        Parametros[0] = String.class;
        Method meth = aClass.getMethod("sayHello", Parametros);
        Object[] Valores = new Object[1];
        Valores[0] = "Teste";
        meth.invoke(ClassesObj, Valores);
    } catch (java.lang.Throwable t) {
        System.out.println(t);
    }
}

}

/**
CustomClassLoader.java
This is a CustomClassLoader implemented according to the Java 1.2 parent delegation
model. It extends java.lang.Classloader & implements the findClass method. The class
loader searches in the searchPath specified in the constructor, to load classes. This
implementation doesnot look for classes in jar/zip files, the searchPath is a list of
directories.
*/

import java.util.List;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.StringTokenizer;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.io.IOException;

public class CustomClassLoader extends ClassLoader {

private List classRepository;//class repository where findClass performs its search

public CustomClassLoader(ClassLoader parent,String searchPath) {
super(parent);
initLoader(searchPath);	
}

public CustomClassLoader(String searchPath) {
super(CustomClassLoader.class.getClassLoader());
initLoader(searchPath);
}

/**
This method overrides the findClass method in the java.lang.ClassLoader
Class. The method will be called from the loadClass method of the parent
class loader when it is unable to find a class to load. 
This implementation will look for the class in the class repository.

@param className A String specifying the class to be loaded
@return  A Class object which is loaded into the JVM by the CustomClassLoader
@throws ClassNotFoundException if the method is unable to load the class
*/
protected Class findClass(String className)
throws ClassNotFoundException
{	
byte[] classBytes = loadFromCustomRepository(className);
if(classBytes != null) {
	return defineClass(className,classBytes,0,classBytes.length);
    }
//else
throw new ClassNotFoundException(className);
}

/* 
   A private method that loads binary class file data from the classRepository.        
*/
private byte[] loadFromCustomRepository(String classFileName) 
throws ClassNotFoundException {
Iterator dirs = classRepository.iterator();
byte[] classBytes = null;
while (dirs.hasNext()) {
    String dir = (String) dirs.next();
    //replace '.' in the class name with File.separatorChar &amp; append .class to the name
    //String classFileName = className;
    classFileName.replace('.',File.separatorChar);
    classFileName += ".class";
    try {
	File file = new File(dir,classFileName);
	if(file.exists () ) {
	    //read file
	    InputStream is = new FileInputStream(file);
	    classBytes = new byte[is.available()];
	    is.read(classBytes);		    
	    break;
	}
    }
    catch(IOException ex) {
	//return null
	System.out.println("IOException raised while reading class file data");
	ex.printStackTrace();
	return null;
    }
}
return classBytes;
}

private void initLoader(String searchPath) {	
//userClassPath is passed in as a string of directories/jar files separated
    //by the File.pathSeparator
classRepository = new ArrayList();
if( (searchPath != null) &amp;&amp; !(searchPath.equals("")) ) {
    StringTokenizer tokenizer = new StringTokenizer(searchPath,File.pathSeparator);
    while(tokenizer.hasMoreTokens()) {
	classRepository.add(tokenizer.nextToken());
    }
}

}

}[/i]

Daniel_Quirino_Olive

Hmmmm, qual a URL do lugar onde você encontrou este ClassLoader?

E

Encontrei este código acima em um site Japones:

http://tech.ccidnet.com/pub/article/c1078_a63975_p1.html

No final do site há um link para JavaClassLoadercode.zip e dentro deste zip estava este código e outras coisas mais… o código que postei foi com algumas alterações q fiz…

O link do arquivo é este…

http://developer.ccidnet.com/pub/html/developer/code/download/JavaClassLoadercode.zip

Garanto que funciona, qualquer dúvida só me mandar um mail…

Carrega e Descarrega a Class para alterações em tempo de execução…

Um espetaculo…

Andei um tempão atras disto, e ja havia perguntado em diversos foruns e ninguem conseguio me ajudar muito, até q consegui… AMEM!!! :wink: Agora aproveitem… heee

[ ]'s

edu…[/b]

Criado 13 de abril de 2004
Ultima resposta 16 de abr. de 2004
Respostas 4
Participantes 3