有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jar java如何使用commnad line工具按类名查找导入完整路径?

有了javap,我可以做到:

xb@dnxb:/tmp$ javap 'java.util.Base64'
Compiled from "Base64.java"
public class java.util.Base64 {
  public static java.util.Base64$Encoder getEncoder();
  public static java.util.Base64$Encoder getUrlEncoder();
  public static java.util.Base64$Encoder getMimeEncoder();
  public static java.util.Base64$Encoder getMimeEncoder(int, byte[]);
  public static java.util.Base64$Decoder getDecoder();
  public static java.util.Base64$Decoder getUrlDecoder();
  public static java.util.Base64$Decoder getMimeDecoder();
}
xb@dnxb:/tmp$ 

但是如何在不知道类名在java下的情况下按类名搜索。什么?(使用命令行实用程序,无需java编码)

xb@dnxb:/tmp$ javap 'Base64'
Error: class not found: Base64
xb@dnxb:/tmp$ javap '*.Base64'
Error: class not found: *.Base64
xb@dnxb:/tmp$ javap '*Base64'
Error: class not found: *Base64
xb@dnxb:/tmp$

共 (1) 个答案

  1. # 1 楼答案

    我想我可以用以下方法创建地图:

    xb@dnxb:/tmp$ java -verbose |& grep rt.jar | head -1 #to find out java runtime path
    [Opened /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar]
    xb@dnxb:/tmp$ unzip /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar -d /tmp/rt #unzip the rt.jar
       creating: /tmp/rt/META-INF/
     extracting: /tmp/rt/META-INF/MANIFEST.MF  
     extracting: /tmp/rt/com/oracle/net/Sdp$1.class  
     extracting: /tmp/rt/com/oracle/net/Sdp$SdpSocket.class
    ...
     extracting: /tmp/rt/java/io/Serializable.class  
     extracting: /tmp/rt/java/lang/String.class  
     extracting: /tmp/rt/java/lang/Object.class  
    xb@dnxb:/tmp$ 
    xb@dnxb:/tmp$ find /tmp/rt > /tmp/rt.map #create list path as map
    xb@dnxb:/tmp$ 
    

    ,然后grep(最好将其作为shell函数):

    xb@dnxb:/tmp$ grep -rni Base64\.class /tmp/rt.map 
    1839:/tmp/rt/java/util/Base64.class
    2276:/tmp/rt/java/util/prefs/Base64.class
    10340:/tmp/rt/com/sun/xml/internal/messaging/saaj/util/Base64.class
    13363:/tmp/rt/com/sun/org/apache/xml/internal/security/utils/Base64.class
    15044:/tmp/rt/com/sun/org/apache/xerces/internal/impl/dv/xs/Base64BinaryDV$XBase64.class
    15096:/tmp/rt/com/sun/org/apache/xerces/internal/impl/dv/util/Base64.class
    xb@dnxb:/tmp$ 
    

    请注意/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/classlist只包含了约2559行,与/tmp/rt.map中的约20706行不同,因此我不能直接使用grep classlist文件