从oracle数据库中获取java类内容



是否可以从数据库中获取java.class文件
我指的是java类,它是通过带有-r -s -v -g参数的loadjava工具加载的。

如何做到这一点?

编辑:我需要可读的形式;)

看看DBMS_JAVA
使用DBMS_JAVA,您可以导出.java.class文件,使用:

  • export_source-导出.java文件

    PROCEDURE export_source(name VARCHAR2, schema VARCHAR2, blob BLOB)
    PROCEDURE export_source(name VARCHAR2, blob BLOB)
    PROCEDURE export_source(name VARCHAR2, clob CLOB)
    
  • export_class-导出.class文件

    PROCEDURE export_class(name VARCHAR2, schema VARCHAR2, blob BLOB)
    PROCEDURE export_class(name VARCHAR2, blob BLOB)
    

在这里,您可以找到一些关于如何使用它来读取.java文件源的示例。

很抱歉,如果有点太晚了,但我最近也遇到了同样的问题,也许它可以帮助别人。

首先,如果您有权通过export_class加载javaclass代码,那么在导出后,您所需要的就是使用javap.exe对其进行反编译。您需要打开cmd.exe(如果您在Windows上工作),在计算机上打印指向javap.exe的路径,而不是在空格"-c-s-verbose"之后,以及在创建的*class文件的另一个空格路径之后。类似的东西:

C:Programm FilesJavaJDKbinjavap.exe -c -s -verbose C:Exportsfile.class

您将拥有反编译的字节码。它是可读的,尽管您需要了解JVM指令。

其次,如果您没有读取它的权限,并且由于某些原因不想获得它,那么您可以用另一种方式提取javaclass代码。所有javaclass代码都以长原始格式存储在表sys.idl_ub1$中。所以你得到了这样的代码:

select a.obj#,a.code,b.name
from sys.idl_ub1$ a 
inner join sys.obj$ b on a.obj#=b.obj#
and b.name = 'Name of your class'

你可以在文本编辑器中打开代码并保存它。不幸的是,你不能在这之后立即反编译它,因为这个表中的代码在开始时保留了一些额外的数据,而java.exe会给出一个错误。所以你应该在记事本中打开它,并尝试从一开始就删除符号,直到java.exe能够反编译它

Êþº¾

并删除它们之前的所有数据。但我不确定它是否适用于所有情况。之后,您将获得反编译的字节码。:)

我也遇到了同样的问题,但在谷歌上搜索了几次后,我就解决了。可能会对某人有所帮助。只是的一个例子

DECLARE 
b CLOB;
c varchar2(2000);
i integer:= 255;
begin
DBMS_LOB.createtemporary(b, false);
DBMS_JAVA.export_resource('<object_name>', '<schema_name>', b);
DBMS_OUTPUT.PUT_LINE('java_resource:');
DBMS_LOB.read(b, i, 1, c);
DBMS_OUTPUT.PUT_LINE(c);
end;

最新更新