Ví dụ trong cuộc sống thực:
public class Control {
public static final long EXPIRED_ON = 1386082988202l;
public static final boolean isExpired() {
return (System.currentTimeMillis() > EXPIRED_ON);
}
}
Sau đó, trong các lớp khác, tôi có thể thoát nếu mã đã hết hạn. Nếu tôi tham chiếu đến biến EXPIRED_ON từ một lớp khác, thì hằng số này nằm trong dòng mã byte, khiến rất khó để theo dõi tất cả các vị trí trong mã kiểm tra ngày hết hạn. Tuy nhiên, nếu các lớp khác gọi phương thức isExpired () thì phương thức thực sự được gọi, nghĩa là hacker có thể thay thế phương thức isExpired bằng một phương thức khác luôn trả về false.
Tôi đồng ý rằng sẽ rất tốt nếu buộc một trình biên dịch nội tuyến phương thức cuối cùng tĩnh cho tất cả các lớp tham chiếu đến nó. Trong trường hợp đó, bạn thậm chí không cần bao gồm lớp Điều khiển, vì nó sẽ không cần thiết trong thời gian chạy.
Từ nghiên cứu của tôi, điều này không thể được thực hiện. Có lẽ một số công cụ Obfuscator có thể làm điều này, hoặc bạn có thể sửa đổi quy trình xây dựng của mình để chỉnh sửa nguồn trước khi biên dịch.
Đối với việc chứng minh nếu phương thức từ lớp điều khiển được đặt nội tuyến đến lớp khác trong khi biên dịch, hãy thử chạy lớp khác mà không có lớp Điều khiển trong classpath.