2009-07-23 27 views
14

Tôi muốn liệt kê các phương thức của các tệp lớp trong bình bằng cách sử dụng công cụ javap. Làm thế nào để làm điều đó để nó liệt kê các phương thức và thành viên của tất cả các tệp lớp trong jar. Ngay bây giờ tôi có thể làm điều đó chỉ cho một lớp học tại một thời điểm.Làm cách nào để in cấu trúc lớp trong tệp jar bằng công cụ javap?

Tôi đang mong đợi một cái gì đó như thế nào nếu tôi nói

javap java.lang.* 

nó nên tranh thủ các phương pháp và các thành viên của tất cả các lớp trong gói java.lang. Nếu javap không có khả năng đó, có công cụ nào có sẵn không?

Trả lời

22
#!/bin/bash 
# Set the JAR name 
jar=<JAR NAME> 
# Loop through the classes (everything ending in .class) 
for class in $(jar -tf $jar | grep '.class'); do 
    # Replace /'s with .'s 
    class=${class//\//.}; 
    # javap 
    javap -classpath $jar ${class//.class/}; 
done 
+6

javap sẽ giải tán tên lớp bằng '/' thay vì '.', bạn chỉ cần xóa hậu tố' .class'. Tôi đang sử dụng 'zipinfo -1 $ {jar} \ *. Class | sed 's/\. class //' | xargs javap -classpath "$ jar" -c -l -private> $ {jar} .javap' –

2

Đầu tiên giải nén tệp jar, điều này sẽ mang lại một loạt các thư mục cho mỗi gói, sau đó áp dụng lệnh javap cho mỗi thư mục.

Vì vậy, ví dụ với tomcat bạn có thể giải nén tệp catalina-balancer.jar trong webapps \ cân bằng và sau đó sử dụng

javap -classpath org\apache\webapp\balancer Rule

mang đến cho

Compiled from "Rule.java" 
interface org.apache.webapp.balancer.Rule{ 
    public abstract boolean matches(javax.servlet.http.HttpServletRequest); 
    public abstract java.lang.String getRedirectUrl(); 
}

Nếu bạn cần phải làm điều này cho tất cả các tập tin lớp trong một gói, bạn sẽ cần phải viết một kịch bản hoặc chương trình để đi bộ classpath và dải .class từ tên tập tin và vượt qua nó để javap.

(Sẽ khá dễ dàng để viết trong perl/bash/java).

+0

Chắc chắn - tôi thích có thêm những thứ đặt xung quanh hệ thống của tôi. Điều này hoạt động nhưng không đẹp. – javadba

9

Thậm chí dễ dàng hơn sẽ

javap -classpath <JARNAME> $(jar -tf <JARNAME> | grep "class$" | sed s/\.class$//) 
+2

thêm vào JARNAME =/path/to/jar và giữ toàn bộ hoạt động trong một dòng đơn – javadba

Các vấn đề liên quan