Untitled

mail@pastecode.io avatar
unknown
java
2 months ago
2.3 kB
3
Indexable
Never
Dưới đây là một ví dụ minh họa cách sử dụng Reflection và ClassLoader để chương trình Java tự động phát hiện và tải các plugin mà không cần biên dịch lại:

Tạo interface cho plugin (PluginInterface.java):

 
public interface PluginInterface {
    void execute();
}
 

Xây dựng một plugin cụ thể (ExamplePlugin.java):

 
public class ExamplePlugin implements PluginInterface {
    @Override
    public void execute() {
        System.out.println("Hello from ExamplePlugin!");
    }
}
 

Trong chương trình chính, sử dụng Reflection và ClassLoader để tải và chạy plugin:

 
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class Main {
    public static void main(String[] args) throws Exception {
        // Đường dẫn đến thư mục chứa các file plugin (JAR)
        File pluginDir = new File("path/to/plugin/directory");
        
        // Duyệt qua các file trong thư mục plugin và tải chúng bằng ClassLoader
        for (File file : pluginDir.listFiles()) {
            if (file.getName().endsWith(".jar")) {
                URL url = file.toURI().toURL();
                URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{url});
                
                // Load class từ file JAR
                Class<?> clazz = classLoader.loadClass("ExamplePlugin");
                
                // Ép kiểu và khởi tạo đối tượng plugin
                PluginInterface plugin = (PluginInterface) clazz.newInstance();
                
                // Gọi phương thức execute của plugin
                plugin.execute();
                
                classLoader.close(); // Đóng ClassLoader sau khi sử dụng
            }
        }
    }
}
 

Trong ví dụ trên, chương trình chính sử dụng Reflection để tải class từ file JAR và ClassLoader để tải class vào bộ nhớ. Sau đó, chương trình gọi phương thức execute của plugin. Bằng cách này, bạn có thể thêm, cập nhật plugin mà không cần phải biên dịch lại chương trình chính.

Lưu ý rằng việc sử dụng Reflection và ClassLoader cần phải được thực hiện cẩn thận và xử lý các ngoại lệ một cách chính xác.
Leave a Comment