testcase 1 и testcase 2 идентичны, существует только одно незначительное отличие, что в Testcase2. Приведен «getIdentitier», но просто делегируйте в супер метод. Отладчик показывает, что Testcase 1, отражение вызывает метод по умолчанию интерфейса (который возвращает NULL), а Testcase 2 вызывает GetIentifier класса. < /P>
Код: Выделить всё
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.hl7.fhir.r4.model.BaseReference;
import org.hl7.fhir.r4.model.Identifier;
import org.hl7.fhir.r4.model.Reference;
import org.junit.jupiter.api.Test;
public class ReflectionTestOnSuperMethods {
@Test
public void testJavaReflection1() throws NoSuchMethodException, SecurityException, IllegalAccessException, InvocationTargetException {
var example1 = new ExampleDto1();
Identifier id = new Identifier();
id.setValue("abc");
example1.setIdentifier(id);
Method method = BaseReference.class.getMethod("getIdentifier");
assertNotNull(example1.getIdentifier());
assertNotNull(method.invoke(example1, new Object[0]));
}
@Test
public void testJavaReflection2() throws NoSuchMethodException, SecurityException, IllegalAccessException, InvocationTargetException {
var example2 = new ExampleDto2();
Identifier id = new Identifier();
id.setValue("abc");
example2.setIdentifier(id);
Method method = BaseReference.class.getMethod("getIdentifier");
assertNotNull(example2.getIdentifier());
assertNotNull(method.invoke(example2, new Object[0]));
}
public static class ExampleDto1 extends Reference {
/*public Identifier getIdentifier() {
return super.getIdentifier();
}*/
}
public static class ExampleDto2 extends Reference {
public Identifier getIdentifier() {
return super.getIdentifier();
}
}
}
https://github.com/thopap/reflectiontest/образной «GetIdentifier» показывает
public org.hl7.fhir.r4.model.identifier org.hl7.fhir.r4.model.reference.getidentifier ()
public defallype org.hl7.fhir.instance.model.api.icompositeType org.hl7.fhir.instance.model.api.ibasereference.getidentifier () < /p>
Inspection. de.thopap.example.reflectiontestonsupermethods $ exmarkpredto2.getidentifier ()
public org.hl7.fhir.instance.model.api.icompositetype de.thopap.example.reflectiontestonsupermethods $ exampedTo2 /> фон
Проблема была первоначально идентифицирована в Testcase of IPF (https://github.com/oehf/ipf). При попытке обновить Hapi FHIR 8.4, некоторые тестовых испытаний не проходят. После тренировки HAPI вводит метод по умолчанию в 8.4. < /P>
my assamption /theory < /strong>
hapi имеет 2 проекта, которые какой-то вид зависимости от цилиндра. org.hl7.fhir.r4 < /li>
< /ul>
Теперь метод по умолчанию был добавлен в интерфейс, но класс реализации не был повторно скомпилирован с этой версией. Похоже, что Java улучшает байт -код при реализации метода из интерфейса. Но если это определение не было во время компиляции, теперь оно может вызвать проблемы во время доступа к отражению. />https://docs.oracle.com/javase/specs/jl ... tml/jls-15>
Подробнее здесь: https://stackoverflow.com/questions/797 ... tion-any-i
Мобильная версия