리플렉션을 사용하지 않고 객체가 배열인지 Java에서 어떻게 볼 수 있습니까? 리플렉션을 사용하지 않고 모든 항목을 어떻게 반복 할 수 있습니까?
Google GWT를 사용하므로 리플렉션을 사용할 수 없습니다.
반성을 사용하지 않고 다음 메서드를 구현하고 싶습니다.
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
BTW : 비 GWT 환경에서 사용할 수 있도록 JavaScript를 사용하고 싶지도 않습니다.
답변
당신이 사용할 수있는 Class.isArray()
public static boolean isArray(Object obj)
{
return obj!=null && obj.getClass().isArray();
}
이것은 객체 및 기본 유형 배열 모두에서 작동합니다.
toString의 경우 Arrays.toString
. 배열 유형을 확인하고 적절한 toString
메서드를 호출해야합니다 .
답변
사용할 수 있습니다 instanceof
.
JLS 15.20.2 유형 비교 연산자 instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
런타임에
instanceof
연산자 의 결과true
는 RelationalExpression 의 값 이 아닌 경우null
이고 참조 는를 발생시키지 않고 ReferenceType 으로 캐스팅 될 수 있습니다ClassCastException
. 그렇지 않으면 결과는false
입니다.
즉, 다음과 같이 할 수 있습니다.
Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"
당신은 객체가이 있는지 확인해야 할 것 instanceof boolean[]
, byte[]
, short[]
, char[]
, int[]
, long[]
, float[]
, double[]
, 또는 Object[]
, 당신은 모든 배열 유형을 감지합니다.
또한 an int[][]
은 instanceof Object[]
이므로 중첩 배열을 처리하려는 방법에 따라 복잡해질 수 있습니다.
를 들어 toString
, java.util.Arrays
이 toString(int[])
당신이 사용할 수있는 다른 오버로드. 또한이 deepToString(Object[])
중첩 배열을 위해.
public String toString(Object arr) {
if (arr instanceof int[]) {
return Arrays.toString((int[]) arr);
} else //...
}
매우 반복적 일 것입니다 (하지만 java.util.Arrays
매우 반복적입니다. ). 그러나 그것은 배열이있는 Java에서하는 방식입니다.
또한보십시오
답변
다음 코드를 사용하여 배열의 각 요소에 개별적으로 액세스 할 수 있습니다.
Object o=...;
if ( o.getClass().isArray() ) {
for(int i=0; i<Array.getLength(o); i++){
System.out.println(Array.get(o, i));
}
}
모든 배열에서 작동하므로 기본 배열의 종류를 알 필요가 없습니다.
답변
기본 유형의 배열간에 또는 기본 유형의 배열과 참조 유형의 배열 간에는 하위 유형 관계가 없습니다. JLS 4.10.3 참조 .
따라서 다음은가 모든 종류obj
의 배열 인지 확인하는 테스트로 올바르지 않습니다 .
// INCORRECT!
public boolean isArray(final Object obj) {
return obj instanceof Object[];
}
특히, obj
기본 요소의 1-D 배열 인 경우 작동하지 않습니다 . (모든 배열 유형이 하위 유형이기 때문에 더 높은 차원의 기본 배열에서 작동합니다.Object
하지만이 경우에는 문제가됩니다.)
Google GWT를 사용하므로 리플렉션을 사용할 수 없습니다.
( isArray
질문 의 배열 부분에 대한) 최상의 솔루션 은 “반사 사용”으로 간주되는 항목에 따라 다릅니다.
-
GWT에서 호출
obj.getClass().isArray()
은 Reflection 1 을 사용하는 것으로 간주되지 않으므로 이것이 최상의 솔루션입니다. -
그렇지 않으면 객체에 배열 유형이 있는지 확인하는 가장 좋은 방법은 일련의
instanceof
표현식 을 사용하는 것입니다 .public boolean isArray(final Object obj) { return obj instanceof Object[] || obj instanceof boolean[] || obj instanceof byte[] || obj instanceof short[] || obj instanceof char[] || obj instanceof int[] || obj instanceof long[] || obj instanceof float[] || obj instanceof double[]; }
-
다음과 같이 객체의 클래스 이름을 엉망으로 만들 수도 있지만 호출
obj.getClass()
은 반사에 가깝습니다.public boolean isArray(final Object obj) { return obj.getClass().toString().charAt(0) == '['; }
1-보다 정확하게 Class.isArray
는 이 페이지 에서 GWT에서 지원 하는 방법으로 나열됩니다 .
답변
유틸리티 클래스를 만들어 클래스가 Collection , Map 또는 Array를 나타내는 지 확인할 수 있습니다.
public static boolean isCollection(Class<?> rawPropertyType) {
return Collection.class.isAssignableFrom(rawPropertyType) ||
Map.class.isAssignableFrom(rawPropertyType) ||
rawPropertyType.isArray();
}
답변
간단히 obj instanceof Object[]
(JShell에서 테스트 됨).