programing

클래스가 Java에서 인터페이스를 구현하는지 여부를 확인합니다.

kingscode 2022. 10. 8. 17:06
반응형

클래스가 Java에서 인터페이스를 구현하는지 여부를 확인합니다.

나는 가지고 있다Class물건.이 타입이 어떤 타입인지 판단하고 싶다.Classobject는 특정 인터페이스를 구현합니다.어떻게 이런 일이 일어날 수 있을까?

나는 다음과 같은 코드를 가지고 있습니다.기본적으로는 지정된 패키지의 모든 클래스 배열을 가져옵니다.그런 다음 어레이를 살펴보고 인터페이스를 구현하는 클래스 개체를 맵에 추가합니다.문제는isInstance()는 객체를 파라미터로 가져옵니다.인터페이스를 인스턴스화할 수 없습니다.그래서 저는 이게 좀 막막해요.좋은 생각 있어요?

Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
    if(clazz.isInstance(/*Some object*/)) //Need something in this if statement
    {
        retVal.put(clazz.getSimpleName(), clazz);
    }
}

다음을 사용해야 합니다.

if (YourInterface.class.isAssignableFrom(clazz)) {
    ...
}

다음 함수를 사용하여 구현된 모든 인터페이스를 가져올 수 있습니다.

Class[] intfs = clazz.getInterfaces();

사용할 수 있습니다.class.getInterfaces()인터페이스 클래스가 거기에 있는지 확인합니다.

Class someInterface; // the interface you want to check for 
Class x; // 
Class[] interfaces = x.getInterfaces();

for (Class i : interfaces) {
    if (i.toString().equals(someInterface.toString()) {
        // if this is true, the class implements the interface you're looking for
    }
}

.class를 추가하는 인스턴스를 설정할 수도 있습니다.

Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
    if(Interface.class.isAssignableFrom(clazz))
    {
        retVal.put(clazz.getSimpleName(), clazz);
    }
}

다른 모든 답변에 대한 기여, 가능한 경우 최신 답변 방법을 사용하지 마십시오.isAssignableFrom를 사용하는 경우 "좋지 않은" 답변도 있습니다.clazz.getInterfaces()보다 뛰어난 퍼포먼스를 가지고 있다isAssignableFrom.

OP 질문에 대한 답을 찾을 때 개발자들이 흔히 실수하는 것은isAssignableFrom인스턴스를 사용할 수 있는 경우 다음 작업을 잘못 수행합니다.

if (IMyInterface.isAssignableFrom(myObject.getClass())) {
    ...

가능한 경우,IMyInterface.class.isInstance또는instanceof둘 다 퍼포먼스가 훨씬 좋기 때문에물론, OP에서 언급한 바와 같이, 이러한 운영 체제에는 단순히 인스턴스가 아닌 인스턴스가 있어야 한다는 단점이 있습니다.class.

if (IMyInterface.class.isInstance(myObject)) {
    ...
if (myObject instanceof IMyInterface) { // +0.2% slower than `isInstance` (*see benchmark)
    ...

더 빠르지만 추악한 해결책은 정전기 저장입니다.Set모든 "유효한" 클래스가 체크하는 대신 이 추악한 솔루션은 직접 다른 모든 접근법보다 성능이 뛰어나기 때문에 많은 클래스를 테스트해야 할 때만 선호됩니다.class확인.

public static final Set<Class<?>> UGLY_SET = Stream.of(MyClass1.class, MyClass2.class, MyClass3.class).collect(Collectors.toCollection(HashSet::new));
if (UGLY_SET.contains(MyClass)) {
    ...

(*) +0.2%의 JMH 벤치마크

사용자 @JBE, @Yura, @alexandr-dubinsky, credits에서 이 답변을 봐주세요.또, 그 답변에는, 벤치마크 결과가 무효가 되기 위한 상세한 내용이 많이 있기 때문에, 확인해 주세요.

언급URL : https://stackoverflow.com/questions/12145185/determine-if-a-class-implements-a-interface-in-java

반응형