ClassLoad para carregar de um banco de dados

To load the classes for Data Base you uses these concepts.... :D

Hoje irei postar um código de um amigo, (Fabio vulgo Balão)...
A idéia é carregar um .class apartir de um banco de dados, para conseguir atualizar algumas partes do sistema de forma centralizada, ou seja, dando um update em um registro no banco de dados.

É claro que este código apenas ilustra o conceito, mas ta ai o código do meu amigo Fabio, código que me surpreendeu, pois eu não imaginei que isto seria possível. Mas como diz o ditado: "Não sabendo que era impossível, ele foi lá e fez".

Parabéns camarada, tu me surpreendeu com este código


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;


class DbClassLoader extends ClassLoader {
private PreparedStatement pstmt;
private ClassLoader parent;

public DbClassLoader(PreparedStatement prepStmtArg) {
super();
this.pstmt = prepStmtArg;
}

public DbClassLoader(PreparedStatement prepStmtArg ,
ClassLoader parentArg) {
super(parentArg);
this.parent = parentArg;
this.pstmt = prepStmtArg;
}

Override
protected Class findClass(String className)
throws ClassNotFoundException {
try {
this.pstmt.setString(1, className);
byte[] classData =
this.pstmt.executeQuery().getBytes(1);
if (classData != null && classData.length > 0) {
return this.defineClass(className, classData,
0, classData.length);
}
} catch (SQLException e) { }

if (this.parent != null)
return this.parent.loadClass(className);

throw new ClassNotFoundException(className);
}

/**
* teste p v se a classe ta funcando
* @param args
*/
public static void main(String[] args) {
try {
Class.forName("org.sqlite.JDBC");
Connection conn =
DriverManager.getConnection("jdbc:sqlite:../teste.db");
String sql = "SELECT data FROM class WHERE class = ?;";
PreparedStatement pstmt =
conn.prepareStatement(sql);
ClassLoader sysClassLoader =
ClassLoader.getSystemClassLoader();
ClassLoader cl = new DbClassLoader(pstmt,
sysClassLoader);
System.out.println(sysClassLoader.getClass().getName());

// Class.forName("SpeedMeterExporterController");
Class controller =
Class.forName("SpeedMeterExporterController", true, cl);
System.out.println(controller.getName());
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}

Nenhum comentário: