我在正在运行的 pl/java
数据库中有一个 Oracle
类,我把源代码放错了地方。
有没有让java字节码退出数据库,所以我可以针对反编译器运行它?
我已经检查过ALL_SOURCE
和 Oracle
声称它没有源代码。
答案 0 :(得分:4)
我最近必须自己做这个,然后整理一个Groovy脚本来完成它。您需要修改连接详细信息并确保在类路径上有Oracle数据库驱动程序
import groovy.sql.Sql
// Change the following to your requirements ...
def extractRoot = "extracted-classes/" // Directory to extract classes into
def user = 'SCOTT' // Schema user
def password = 'tiger' // Yes, it's the password
def host = 'localhost' // Database host
def sid = 'orcl' // Database SID
def port = 1521 // Database listener port
def saveBlob(blob, root, name, extension) {
def byteStream = blob.getBinaryStream()
def bytes = new byte[blob.length()]
byteStream.read(bytes)
def dir = root + name.replaceAll(/\/[^\/]+$/, '')
if (dir != name) {
new File(dir).mkdirs()
}
def f = new File(root + name + extension)
println "Writing ${f.getCanonicalPath()}"
f.delete()
f.withOutputStream { s ->
s.write(bytes)
}
}
sql = Sql.newInstance("jdbc:oracle:thin:@${host}:${port}:${sid}", user,
password, 'oracle.jdbc.driver.OracleDriver')
sql.eachRow("select name from all_java_classes where owner = ${user}") {
sql.call('''
declare
b blob;
begin
dbms_lob.createtemporary(b, FALSE);
dbms_java.export_class(?, ?, b);
? := b;
end;''', [it.name, user, Sql.BLOB]) { blob ->
saveBlob(blob, extractRoot, it.name, '.class')
}
}
sql.eachRow("select dbms_java.longname(object_name) \"name\" from all_objects where object_type = \'JAVA RESOURCE\' and owner = ${user}") {
sql.call('''
declare
b blob;
begin
dbms_lob.createtemporary(b, FALSE);
dbms_java.export_resource(?, ?, b);
? := b;
end;''', [it.name, user, Sql.BLOB]) { blob ->
saveBlob(blob, extractRoot, it.name, '')
}
}
答案 1 :(得分:1)
如果您了解有关它的一些信息,那么您可以使用dbms_java
。
具体来说,根据您的问题判断export_class
;虽然这可能需要你做更多的侦探工作。如果您的代码存储在实际的包中,dbms_metadata
也应该能够提供帮助。
Java对象也应显示在all_objects
中,如果需要,它可以帮助您跟踪架构和/或名称。