从oracle数据库获取java类内容

时间:2015-04-30 10:34:34

标签: java database oracle loadjava

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

怎么做?

修改 我需要它以可读的形式;)

3 个答案:

答案 0 :(得分:3)

看一下DBMS_JAVA package 使用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)
    

Here您可以找到一些有关如何使用它来阅读.java文件来源的示例。

答案 1 :(得分:0)

我遇到了同样的问题,但在google上进行了几次搜索之后我解决了这个问题。可能会帮助某人。只是一个例子

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;

答案 2 :(得分:0)

对不起,如果这有点太晚了,但是我最近也遇到了同样的问题,也许它可以帮助某个人。

首先,如果您有权通过export_class加载javaclass代码,则导出后所需要做的就是使用javap.exe反编译它。您需要打开cmd.exe(如果您在Windows上工作),请在计算机上在其中打印javap.exe的路径,而不是在空格“ -c -s -verbose”之后,以及在另一个空格之后,将* class文件创建。像这样:

C:\Programm Files\Java\JDK\bin\javap.exe -c -s -verbose C:\Exports\file.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'

您在文本编辑器中打开代码并保存。不幸的是,您不能在此之后立即对其进行反编译,因为该表中的代码在开始时会包含一些额外的数据,并且javap.exe会给出错误。因此,您应该在记事本中打开它,并尝试在开始时删除符号,直到java.exe将能够对其进行反编译。就我而言,我必须看这样的符号:

Êþº¾

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