Tôi đang cố gắng xác định Trình nạp lớp tùy chỉnh.ContextClassLoader không hooking
public class ExampleLoader extends ClassLoader
{
public Class<?> findClass(String name) throws ClassNotFoundException
{
System.out.println("This never gets printed");
return super.findClass(name);
}
public Class<?> loadClass(String name, boolean b)
throws ClassNotFoundException
{
System.out.println("This never gets printed");
return super.loadClass(name, b);
}
}
Và tất nhiên mã của tôi để kiểm tra nó:
public class Tester
{
public static void main(String[] args)
{
Thread t = new FooThread();
t.setContextClassLoader(new ExampleLoader());
t.start();
}
}
class FooThread extends Thread
{
public void run()
{
new RandomClass();
}
}
Vấn đề là dòng của tôi không bao giờ được in ra. Rõ ràng tôi đang thiếu một cái gì đó.
Ra khỏi tò mò, làm thế nào để các ứng dụng như Tomcat làm cho công việc này? Sự hiểu biết của tôi là tất cả các ứng dụng web tomcat chạy từ bên trong một jvm dùng chung, nhưng khi chúng sử dụng các lớp, các định nghĩa lớp đến từ các cuộc chiến tranh tương ứng của chúng. Bất kỳ ý tưởng làm thế nào họ đạt được điều này? – Jim
Chúng sử dụng 'ClassLoader # loadClass()'. Ví dụ 'ClassLoader' được lưu trữ và truyền xung quanh trong chuỗi theo cách này. Một điểm khởi đầu tốt để tìm trong mã nguồn là 'org.apache.catalina.core.DefaultInstanceManager'. – BalusC