É possível carregar .class em tempo de execução?

Buenas.

É possível carregar arquivos .class em tempo de execução ou somente .jar?

Os .jar eu consegui carregar, usando o Class.forName, porém .class sem sucesso.

Existe alguma forma de fazer isto?

Valew!

Nunca fiz, mas existe a classe ClassLoader, e um método loadClass. Acredito que seja possível com ela. Quem souber, pode dizer melhor.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html#loadClass(java.lang.String)

Acho que o que você conseguiu foi carregar classes que estavam no mesmo JAR que a sua classe executora e não conseguiu carregar classes que estavam fora do JAR me corrija se nao for isso.

Acho que para carregar classes que estão fora do JAR você deve colocá-las no classpath do manifest do JAR.

[quote=dstori]Acho que o que você conseguiu foi carregar classes que estavam no mesmo JAR que a sua classe executora e não conseguiu carregar classes que estavam fora do JAR me corrija se nao for isso.

Acho que para carregar classes que estão fora do JAR você deve colocá-las no classpath do manifest do JAR.[/quote]

Eu não entendi assim, o que você quer fazer afinal?

Fiz o teste criando dois projetos.

Um projeto fiz o que queria, e gerei um .jar dele. Este .jar gerado, eu consegui carregar no segundo projeto corretamente.

Agora o q eu realmente preciso, é pegar o .class do primeiro projeto e carregar no segundo.

Alguma sugestão?

[quote=Puri]Fiz o teste criando dois projetos.

Um projeto fiz o que queria, e gerei um .jar dele. Este .jar gerado, eu consegui carregar no segundo projeto corretamente.

Agora o q eu realmente preciso, é pegar o .class do primeiro projeto e carregar no segundo.

Alguma sugestão?[/quote]

Você quer usar classes do jar que seu projeto depende?

[quote=Puri]Buenas.

É possível carregar arquivos .class em tempo de execução ou somente .jar?

Os .jar eu consegui carregar, usando o Class.forName, porém .class sem sucesso.

Existe alguma forma de fazer isto?
[/quote]

Vc consegue ambos da mesma forma.
O ponto é que o .class tem que estar no classpath da aplicação ( tal como o jar está).
Depois com o class.forname ( que é um atalho para o ClassLoader) vc consegue carregar a classe.

Vc pode criar um classLoader seu para aumentar o que o sistema considera o “classpath”. ( o classloader do JWS ,por exemplo, considera um URL remoto)


       /** 
	 * chamada como algo: addURL(new File("c:/project/com/sample/Test.class"));
	 */
	private void addURL(final File directory) {
		try {
			final URL url = directory.toURL();
			final Method method = this.getMethod();
			final URLClassLoader sysloader = (URLClassLoader) this.getClass().getClassLoader();
			method.invoke(sysloader, new Object[]{url});
		} catch (final Exception e) {
			e.printStackTrace();
		}
	}

	private Method getMethod() {
		final Class<URLClassLoader> sysclass = URLClassLoader.class;
		Method method = null;
		try {
			method = sysclass.getDeclaredMethod("addURL", new Class[]{URL.class});
			method.setAccessible(true);
			return method;
		} catch (final Exception e) {
			e.printStackTrace();
			return null;
		}
	}

Esse código adiciona ao classPath. Para usar a classe use Class.forName