programing

Java 어레이 리플렉션: isArray vs. instance of

bestcode 2022. 8. 28. 09:39
반응형

Java 어레이 리플렉션: isArray vs. instance of

다음 사용 사이에 선호도 또는 동작 차이가 있습니까?

if(obj.getClass().isArray()) {}

그리고.

if(obj instanceof Object[]) {}

?

대부분의 경우,instanceof개체가 배열인지 여부를 테스트하는 연산자.

일반적으로 컴파일 시 알려진 특정 유형으로 다운캐스트하기 전에 개체 유형을 테스트합니다.예를 들어, 아마도 당신은 이 코드와 함께 사용할 수 있는 코드를 작성했을 것입니다.Integer[]또는int[]출연진들을 보호하려면instanceof:

if (obj instanceof Integer[]) {
    Integer[] array = (Integer[]) obj;
    /* Use the boxed array */
} else if (obj instanceof int[]) {
    int[] array = (int[]) obj;
    /* Use the primitive array */
} else ...

JVM 레벨에서는instanceof연산자는 대부분의 JVM 구현에서 최적화되어 있는 특정 "인스턴스" 바이트 코드로 변환됩니다.

드문 경우이지만 반사를 사용하여 알 수 없는 유형의 객체 그래프를 이동할 수 있습니다.이런 경우에는isArray()컴파일 시 컴포넌트 타입을 모르기 때문에 도움이 될 수 있습니다.예를 들어 시리얼라이제이션메커니즘을 구현하고 어레이의 각 컴포넌트를 타입에 관계없이 동일한 시리얼라이제이션 방식으로 전달할 수 있습니다.

특수한 경우는 null 참조와 primitive 어레이 참조 두 가지가 있습니다.

null 참조는 다음과 같습니다.instanceof결과가 되다false, 한편,isArray던지다NullPointerException.

primitive 어레이에 적용되어 있습니다.instanceof수율false오른쪽 오퍼랜드의 컴포넌트 유형이 컴포넌트 유형과 정확히 일치하지 않는 한.그에 반해서,isArray()돌아온다true모든 컴포넌트 타입에 대응합니다.

후자의 경우 obj가 null일 경우 Null Pointer를 얻을 수 없습니다.예외지만 거짓이다.

한다면obj종류int[]예를 들어, 그러면 그것은 배열이 됩니다.Class의 예가 될 수는 없다Object[]그럼 어떻게 하고 싶으세요?obj캐스팅 할 거면 같이 해요.instanceof반사를 이용하려면.getClass().isArray().

getClass().isArray()Sun Java 5 또는 6 JRE에서는 IBM보다 훨씬 느립니다.

사용하는 것보다 훨씬 더clazz.getName().charAt(0) == '['Sun JVM이 더 빠릅니다.

최근에 Groovy 애플리케이션을 JDK 5에서 JDK 6으로 업그레이드하는 데 문제가 발생했습니다.isArray()JDK6에서 실패했습니다.

MissingMethodException:
No signature of sun.reflect.generics.reflectiveObjects.GenericArrayTypeImpl.isArray() ...

로의 변경instanceof Object[]이걸 고쳤어

반사 솔루션과 비반사 솔루션 중 선택할 수 있는 경우에는 반사 솔루션(반사 클래스 개체)을 선택하지 마십시오."잘못했다"거나 그런 것은 아니지만, 반성과 관련된 것은 일반적으로 덜 명확하고 덜 명확합니다.

Java 배열 리플렉션은 "인스턴스"를 수행할 수 있는 클래스의 인스턴스가 없는 경우에 사용됩니다.예를 들어 JPA와 같이 값을 클래스의 새 인스턴스에 주입하는 일종의 주입 프레임워크를 작성하는 경우 isArray() 기능을 사용해야 합니다.

저는 12월 초에 이것에 대해 블로그에 올렸습니다.http://blog.adamsbros.org/2010/12/08/java-array-reflection/

(명백한 늘 케이스 이외에는) 둘 사이에 찾을 수 있는 동작의 차이는 없습니다.어떤 버전이 더 좋은지 두 번째 버전으로 하겠습니다.Java에서 이 작업을 수행하는 표준 방법입니다.

('왜냐하면 ''는 ''로 되어 있기 때문에'')String[] instanceof Object[] trueis true)에 대해 계속 첫 하게 할 수 . 코드 리뷰어가 계속해서 이 문제에 대해 질문할 경우 첫 번째 항목을 사용하여 보다 명확하게 할 수 있습니다.

언급URL : https://stackoverflow.com/questions/219881/java-array-reflection-isarray-vs-instanceof

반응형