Интересно, как фреймворки или, например, API JDK выполняют пользовательский код клиента, который реализован на основе интерфейса, который он предоставляет.
Например, javax.security
запускает клиент с пользовательским кодом, предоставляемый через реализованные методы интерфейса. Я не могу четко объяснить, как API сможет запускать реализованный класс. Я думаю, что все в порядке, они предоставляют API через интерфейс Java, но для запуска этого пользовательского кода должен быть механизм выполнения или механизм выполнения.
import javax.security.auth.spi.LoginModule;
public class CustomerLoginModule implements LoginModule {
...
}
package javax.security.auth.spi;
import javax.security.auth.Subject;
import javax.security.auth.AuthPermission;
import javax.security.auth.callback.*;
import javax.security.auth.login.*;
import java.util.Map;
public interface LoginModule {
void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String,?> sharedState,
Map<String,?> options);
boolean login() throws LoginException;
boolean commit() throws LoginException;
boolean abort() throws LoginException;
boolean logout() throws LoginException;
}
Как Java Security API выполняет клиентский код, который не соответствует этому интерфейсу внутри? Как это работает под капотом?
Или, например, опять же, в контексте интерфейса, я не могу четко объяснить, как этот API выполняет пользовательский код клиента.
package java.util;
public interface EventListener {
}
package com.xxx;
import java.util.EventListener;
public interface IPreferenceObserver extends EventListener {
void onPreferenceChange();
}