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
'programing' 카테고리의 다른 글
왼쪽 패드 인쇄(스페이스 포함) (0) | 2022.08.28 |
---|---|
Vuex를 사용하여 어레이 요소를 효과적으로 관리하는 방법 (0) | 2022.08.28 |
Django의 정적 파일 가져오기에는 Vue.js.vue 템플릿 내 작업이 포함됩니다. (0) | 2022.08.27 |
Vuex 모듈 - ..mapGetters correvctly를 설정할 수 없습니다. (0) | 2022.08.27 |
SDL2에서 텍스트를 렌더링하는 방법 (0) | 2022.08.27 |