从oracle数据库获取java类内容

从oracle数据库获取java类内容,java,database,oracle,loadjava,Java,Database,Oracle,Loadjava,是否可以从数据库中获取java.class文件? 我指的是java类,它是通过带有-r-s-v-g参数的loadjava工具加载的 如何做到这一点 编辑: 我需要可读的形式;) 看一看地图。 使用DBMS\u JAVA可以导出.JAVA和.class文件,使用: export\u source-导出.java文件 PROCEDURE export_source(name VARCHAR2, schema VARCHAR2, blob BLOB) PROCEDURE export_source(

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

如何做到这一点

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

看一看地图。
使用
DBMS\u JAVA
可以导出
.JAVA
.class
文件,使用:

  • export\u 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)
    
    PROCEDURE export_class(name VARCHAR2, schema VARCHAR2, blob BLOB)
    PROCEDURE export_class(name VARCHAR2, blob BLOB)
    
  • export\u class
    -导出
    .class
    文件

    PROCEDURE export_source(name VARCHAR2, schema VARCHAR2, blob BLOB)
    PROCEDURE export_source(name VARCHAR2, blob BLOB)
    PROCEDURE export_source(name VARCHAR2, clob CLOB)
    
    PROCEDURE export_class(name VARCHAR2, schema VARCHAR2, blob BLOB)
    PROCEDURE export_class(name VARCHAR2, blob BLOB)
    

你可以找到一些关于如何使用它来读取
.java
文件源代码的示例。

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

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;
声明
b CLOB;
c varchar2(2000年);
i整数:=255;
开始
DBMS_LOB.createtemporary(b,false);
导出资源(“”,,,b);
DBMS_OUTPUT.PUT_行('java_资源:');
DBMS_LOB.read(b,i,1,c);
DBMS_OUTPUT.PUT_行(c);
结束;

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

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

C:\Programm Files\Java\JDK\bin\javap.exe -c -s -verbose C:\Exports\file.class
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'
Êþº¾
您将反编译字节码。它是可读的,尽管您需要了解JVM指令

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

C:\Programm Files\Java\JDK\bin\javap.exe -c -s -verbose C:\Exports\file.class
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能够对其进行反编译。在我的例子中,我必须看到这样的符号:

C:\Programm Files\Java\JDK\bin\javap.exe -c -s -verbose C:\Exports\file.class
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.sql.SQLException:没有这样的java模式对象
(带有
export\u source
)。当我使用
export\u类时
blob包含字母和数字链。恐怕我可以使用
export\u class
,因为我正在通过loadjava加载整个.jar,其中有编译的
.class'文件。所以问题是,当然,
export_class`返回一个类,但形式无法识别。当我将这个blob(由
export
返回)保存为
.class
文件时,JVM toobut+1无法识别它,但对您来说,最后我从export中得到了一些东西-我没有表示我需要可读的形式;)