Cargar una clase Runtime
Publicado: 30 Abr 2012, 20:37
Este es un ejemplo de cargar una clase encriptada.
Creamos una interfaz llamada Hola.
Hola.java
Extendemos de la clase Hola
HolaMundo.java
Extendemos de la clase ClassLoader, aquí es donde nace la magia
ClassLoaderMod.java
Esta clase Prueba.java es donde hacemos uso de las demas.
NOTA: Compilamos HolaMundo.java y tenemos HolaMundo.class y esta la encriptamos con Base64 y agregamos Holamundo.class y le quitamos la extensión y lo agregamos donde están las otras clases compiladas y vuala!!! Cargamos las clases Runtime :P
Creamos una interfaz llamada Hola.
Hola.java
Código: Seleccionar todo
public interface Hola {
public void imprimme();
}
HolaMundo.java
Código: Seleccionar todo
public interface HolaMundo implements Hola {
public void imprimme(){
System.out.println("Hola mundo");
}
}
ClassLoaderMod.java
Código: Seleccionar todo
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
*
* @author adwind
*/
public class ClassLoaderMod extends ClassLoader {
public ClassLoaderMod() {
}
@Override
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
InputStream m = getResourceAsStream(name);
ByteArrayOutputStream b = new ByteArrayOutputStream();
try {
byte[] buf = new byte[m.available()];
m.read(buf);
b.write(buf, 0, buf.length);
} catch (IOException ex) {
ex.printStackTrace();
}
return Base64.decode(new String(b.toByteArray()));
}
}
Esta clase Prueba.java es donde hacemos uso de las demas.
Código: Seleccionar todo
/**
*
* @author adwind
*/
public class Prueba {
public static void main(String[] args){
ClassLoader cc=new ClassLoaderMod();
try {
//Si el constructor tiene, parametros entonces en el metodo
//getDeclaredConstructor() se le pasan el tipo de clase
//getDeclaredConstructor(String.class, int.class).newInstance("HOLAMUNDO", 2);
Hola aaa=(Hola)cc.loadClass("HolaMundo").getDeclaredConstructor().newInstance();
aaa.imprimme();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}