클래스가 Java에서 인터페이스를 구현하는지 여부를 확인합니다.
나는 가지고 있다Class
물건.이 타입이 어떤 타입인지 판단하고 싶다.Class
object는 특정 인터페이스를 구현합니다.어떻게 이런 일이 일어날 수 있을까?
나는 다음과 같은 코드를 가지고 있습니다.기본적으로는 지정된 패키지의 모든 클래스 배열을 가져옵니다.그런 다음 어레이를 살펴보고 인터페이스를 구현하는 클래스 개체를 맵에 추가합니다.문제는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
'programing' 카테고리의 다른 글
java.displaces를 클릭합니다.ClassNotFoundException: com.mysql.jdbc.드라이버 인 이클립스 (0) | 2022.10.08 |
---|---|
MapStruct와 Lombok이 함께 작동하지 않음 (0) | 2022.10.08 |
PyCharm은 왜 방법을 정적으로 바꾸려고 제안합니까? (0) | 2022.10.08 |
Gradle: 클래스 경로와 컴파일 종속성의 차이점은 무엇입니까? (0) | 2022.10.08 |
JavaScript에서 어레이를 루프합니다. (0) | 2022.10.08 |