리플렉션을 통해 Java 클래스가 추상적인지 여부를 어떻게 확인할 수 있습니까?


184

Jar 파일의 클래스를 통해 간섭하고 추상적이지 않은 클래스를 찾고 싶습니다. 클래스를 인스턴스화하고 InstantiationException을 트래핑하여이 문제를 해결할 수 있지만 일부 클래스가 시작되면 성능이 저하됩니다. Class.java 문서에서 isAbstract ()와 같은 것을 찾을 수 없습니다.

답변:


321

클래스 객체에서 getModifiers ()를 호출하면 수정 자 중 하나로 추상이 표시됩니다.

링크 가 도움이 될 것입니다.

 Modifier.isAbstract( someClass.getModifiers() );

또한:

http://java.sun.com/javase/6/docs/api/java/lang/reflect/Modifier.html

http://java.sun.com/javase/6/docs/api/java/lang/Class.html#getModifiers ()


1
감사! 작은 참고 사항 : "클래스"를 변수 이름으로 사용할 수 없습니다. 예를 변경하고 싶을 수도 있습니다.
Tim Büthe

@seth Modifier.isAbstract( someClass.class.getModifiers() );아마 당신이 그것을 바꾸고 싶을 것 같아요
steven7mwesigwa

일반 자바 명명 규칙에 따라 중 하나입니다 someClass.getModifiers()또는 SomeClass.class.getModifiers()어디Class<SomeClass> someClass = SomeClass.class;
넥서스

31
Class myClass = myJar.load("classname");
bool test = Modifier.isAbstract(myClass.getModifiers());

1
또한 세스가 말한 것. :)
Stobor

1
public static boolean isInstantiable(Class<?> clz) {
    if(clz.isPrimitive() || Modifier.isAbstract( clz.getModifiers()) ||clz.isInterface()  || clz.isArray() || String.class.getName().equals(clz.getName()) || Integer.class.getName().equals(clz.getName())){
        return false;
    }
    return true;
}

인터페이스이고 클래스 이름이 java.util.List 인 경우 ArrayList를 작성할 수 있습니다.
Abdushkur Ablimit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.