I want to make an application that can dynamically load plug-ins but I've not found any literature on Internet.
The difficult thing is: I don't know the name in advance.
For example I've a Plugin interface:
public interface Plugin {
public static Plugin newPlugin();
public void executePlugin(String args[]);
}
So that every Class implementing Plugin in the jar file are instantiated in a list:
Method method = classToLoad.getMethod ("newPlugin");
mylist.add(method.invoke(null);
First problem is, I cannot have a static method in an interface.
Second problem is, I don't know how to find all classes that implement an interface
Thanks for your help.
解决方案
So it seems like you want to dynamically discover Classes that implement a specific interface (e.g., Plugin) at runtime. You have basically two choices for this:
Use a component framework like osgi
Use Java's internal discovery process (ServiceLoader)
Since there are many good tutorials on osgi (also small ones), I will not detail that here. To use Java's internal discovery process, you need to do the following:
Bundle all "new" classes that you wish to discover into a jar file
Create a new file inside the jar file: META-INF/services/package.Plugin You must use the full package qualifier here
This file is a simple text file and contains the fully qualified name of each class implementing Plugin in that jar-file
Place that jar file into the classpath of your (potentially already running) application
Discover the services:
Service discovery is done like this:
ServiceLoader loader = ServiceLoader.load(Plugin.class)
for (Plugin p : loader) {
// do something with the plugin
}
As for static methods in interfaces: not possible. The semantics of that would also be somewhat weird as static methods are accessible without an instance of a class, and interfaces just define the methods, without any functionality. Thus, static would allow to call Interface.doSomething() whereas the interface does not define any functionality, this leads just to confusion.
edit:
added description what should be in the meta-file