4

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

这个怎么做?

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

4

3 回答 3

4

看看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文件源的示例。

于 2015-04-30T17:27:03.380 回答
1

抱歉,如果为时已晚,但我最近遇到了同样的问题,也许它可以帮助某人。

首先,如果您有权通过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能够反编译它。就我而言,我必须查看这样的符号:

Êþº¾

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

于 2019-06-07T07:35:28.847 回答
0

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

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;
于 2018-04-18T12:36:51.277 回答