Tôi có tệp jar của bên thứ ba đi kèm với javadocs chỉ cho một phần của API. Có cách nào để đảo ngược thiết kế tệp jar để có được danh sách đầy đủ các lớp và phương thức không?Làm cách nào để lấy chữ ký của phương thức từ tệp jar?
Trả lời
jar tf
sẽ liệt kê nội dung cho bạn. javap
sẽ cho phép bạn xem thêm chi tiết về các lớp học (xem hướng dẫn công cụ).
Ví dụ nếu bạn có một lớp có tên mypkg.HelloWorld
trong một cái lọ myjar.jar
sau đó chạy nó như
javap -classpath myjar.jar mypkg.HelloWorld
Tuy nhiên, bạn có chắc bạn muốn được sử dụng các API này chưa được công bố? Nó thường là một ý tưởng thực sự tồi tệ.
Nếu bạn đang sử dụng nhật thực, bạn chỉ có thể thêm nó vào đường dẫn lớp của dự án và khám phá nó bằng cách sử dụng treeview và/hoặc hỗ trợ nội dung.
Tôi cho rằng các IDE khác có thể hoạt động tương tự.
Từ quan điểm dòng lệnh, bạn có thể mở nó (jar xf foo.jar) và sử dụng javap đối với tất cả các tệp.
Như Scott đã nói, bạn có thể sử dụng Eclipse để nhận được nhiều thứ bạn đang tìm kiếm.
Tôi khuyên bạn nên lấy JadClipse plugin, nó sẽ dịch ngược các tệp .class một cách nhanh chóng và hiển thị cho bạn mã Java thực khi bạn duyệt các lớp trong IDE.
Đồng ý. Một sự kết hợp rất mạnh mẽ. –
Eclipse sẽ làm việc lớn
Một Java Decompiler sẽ dịch các lớp học trở lại vào một số semblence mã nguồn mà bạn có thể nghiên cứu để tìm hiểu về các lớp học, các phương pháp, chữ ký của họ, và thậm chí có một số cái nhìn sâu sắc thành các giá trị hợp lệ cho một số đối số (ví dụ: không chuyển một giá trị null cho đối số này hoặc bạn sẽ kích hoạt một NullPointerException ngay lập tức). Nhưng cuộn lên tay áo của bạn để mở jar và chạy trình biên dịch ngược với tất cả các tệp lớp. Đây thực chất là những gì Eclipse đang làm cho văn bản trợ giúp với các lớp không có giấy tờ.
Cuối cùng, tất nhiên, "real programmer" sẽ đọc trực tiếp số byte-code mà không cần trình giải mã.
trợ giúp nhanh để biết các phương thức của lớp bình thường (không phải lớp trừu tượng), tôi làm như sau.
tên lớp mới(). Nhấn ctrl + dấu cách để liệt kê các phương thức trong nhật thực.
Sử dụng Eclipse> Trình khám phá gói để xem các lớp và thứ bậc phân cấp.
Content Assist (tính năng tự động hoàn (ctrl + space)) cũng là một trợ giúp tốt, nhưng wouldnt khuyên bạn nên sử dụng một API chưa được công bố
Bạn có thể sử dụng thư viện WALA để đọc ra tất cả các phương pháp chữ ký. Tuy nhiên, bạn sẽ cần tải Stub-Code cho Java trước. Chương trình sau đây nên đọc to tất cả chữ ký:
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.types.ClassLoaderReference;
import java.util.jar.JarFile;
import java.io.IOException;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
public class methods {
public static void main(String[] args) throws IOException, ClassHierarchyException {
AnalysisScope scope = AnalysisScope.createJavaAnalysisScope();
scope.addToScope(ClassLoaderReference.Primordial, new JarFile("jSDG-stubs-jre1.5.jar"));
scope.addToScope(ClassLoaderReference.Application, new JarFile("myProgram.jar"));
IClassHierarchy cha = ClassHierarchy.make(scope);
for (IClass cl : cha) {
if (cl.getClassLoader().getReference().equals(ClassLoaderReference.Application)) {
for (IMethod m : cl.getAllMethods()) {
String ac = "";
if (m.isAbstract()) ac = ac + "abstract ";
if (m.isClinit()) ac = ac + "clinit ";
if (m.isFinal()) ac = ac + "final ";
if (m.isInit()) ac = ac + "init ";
if (m.isNative()) ac = ac + "native ";
if (m.isPrivate()) ac = ac + "private ";
if (m.isProtected()) ac = ac + "protected ";
if (m.isPublic()) ac = ac + "public ";
if (m.isSynchronized()) ac = ac + "synchronized ";
System.out.println(ac + m.getSignature());
}
}
}
}
}
Nếu bạn sử dụng phiên bản WALA thích hợp từ here thì Dalvik (ví dụ:Ứng dụng Android).
- 1. Làm cách nào để gia hạn chữ ký jar?
- 2. Cách tạo chữ ký phương thức?
- 3. Cách lấy MethodInfo từ một ký hiệu phương thức
- 4. C#: Chữ ký phương thức?
- 5. Cách tạo phương thức có chữ ký là Danh sách
- 6. Lấy một đại biểu từ phương thức
- 7. Làm cách nào để đọc tệp tài nguyên từ tệp jar Java?
- 8. Làm cách nào để lấy tên hàm hoặc phương thức từ bên trong hàm hoặc phương thức Python?
- 9. Làm thế nào để lấy tên phương thức hiện tại để xuất nó vào tệp nhật ký?
- 10. Lấy tên jar thực thi từ bên trong phương thức main()
- 11. Cách lấy tên của lớp chính của tệp jar từ Java?
- 12. In chữ ký đầy đủ của một phương thức từ MethodInfo
- 13. Cách đọc tệp từ tệp jar?
- 14. đăng và nhận cùng với chữ ký phương thức
- 15. Làm cách nào để lấy các đối tượng Hàm từ các phương thức trong Scala?
- 16. Làm thế nào để xác định mảng của lớp trong tham số chữ ký phương thức GetMethodID?
- 17. cách biết lớp/gói/phương thức nào được sử dụng bởi tệp jar đã cho?
- 18. Tôi làm cách nào để kiểm tra tệp jar đã ký bằng cách sử dụng Ant?
- 19. Tôi làm cách nào để ký các JAR độc lập của ProGuard'ed Scala?
- 20. Làm cách nào để xuất các lỗi java -jar thành một tệp văn bản/nhật ký?
- 21. Chữ ký phương thức Generics và chữ ký chuẩn giống hệt nhau
- 22. Làm cách nào để xem chữ ký hàm trong Python?
- 23. Cách lấy tên lớp từ phương thức tĩnh tĩnh
- 24. Cách đăng ký tệp JAR bằng tệp .PFX
- 25. Làm cách nào để gọi phương thức không tĩnh từ phương thức chính?
- 26. Làm cách nào để tạo một JAR từ .java
- 27. Làm cách nào để lấy phiên bản từ tệp gemspec?
- 28. Làm cách nào để tự động cập nhật Javadoc khi thay đổi chữ ký phương thức trong Eclipse?
- 29. Làm cách nào để sao chép nội dung của tệp này sang tệp khác bằng phương thức tệp của Ruby?
- 30. Có cách nào để gắn cờ (tại thời gian biên dịch) các phương thức "ghi đè" có chữ ký không khớp với chữ ký cơ sở không?
Giống như với sự phản ánh? –