개체의 클래스를 결정하는 방법
if classB
학급의C
수업을 연장하다A
그리고 나는 타입의 물건을 가지고 있다.B
또는C
인스턴스 유형을 어떻게 결정할 수 있는가?
if (obj instanceof C) {
//your code
}
객체의 런타임 유형을 반환한다.
여러 정답이 제시되었지만 여전히 더 많은 방법이 있다.Class.isAssignableFrom()
그리고 단순히 물체를 던지려고 시도한다.ClassCastException
).
가능한 요약 방법
가능한 테스트 방법을 요약해 봅시다.obj
유형이다.C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
의 차이점null
처리
에 차이가 있다null
처리 방법:
- 처음 두 가지 방법에서 표현식은 다음을 평가한다.
false
만일obj
이다null
(null
어떤 예도 아니다. - 세 번째 방법은
NullPointerException
명백하게 - 반대로 4번째와 5번째 방법은 받아들인다.
null
때문에null
어떤 종류든 캐스팅할 수 있다!
기억하기
null
어떤 유형의 인스턴스도 아니지만 어떤 유형에도 캐스팅될 수 있다.
메모들
Class.getName()
물체가 유형이 아닌 경우 "Is-Of" 테스트를 수행하는데 사용해서는 안 된다.C
그러나 그것의 하위 클래스, 그것은 완전히 다른 이름과 패키지를 가질 수 있다. 그러나 그것은 여전히 유형이다.C
.- 동일한 상속이유
Class.isAssignableFrom()
대칭이 아님:
obj.getClass().isAssignableFrom(C.class)
돌아올 것이다false
의 종류라면obj
의 하위급이다.C
.
사용할 수 있는 항목:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. 하지만 나는 대부분 그것을 제어 흐름이나 비슷한 것에 사용하는 것은 좋지 않다고 생각한다.
제안된 방법 중 어떤 것을 사용하든 나쁜 OO 디자인에 기반을 둔 코드 냄새로 간주된다.
만약 당신의 디자인이 좋다면, 당신은 사용할 필요가 없다는 것을 발견해서는 안 된다.getClass()
또는instanceof
.
제안된 방법들 중 어느 것이든 괜찮지만, 단지 디자인 측면에서 명심해야 할 것이다.
우리는 이 경우에 반성을 사용할 수 있다.
objectName.getClass().getName();
예:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
이 경우 객체가 전달되는 클래스의 이름을 얻으십시오.HttpServletRequest
인터페이스 재호환 변수.
「」에도 방법이 있다.Class
"수업.을 통해 사물의 클래스를 얻는다면.myBanana.getClass()
당신은 당신의 목적이 무엇인지 볼 수 있다.myApple
와 같은 부류의 예다.myBanana
경유로
myBanana.getClass().isInstance(myApple)
확인isinstance()
런타임에 알고 싶다면 충분하지 않을 것이다.사용:
if(someObject.getClass().equals(C.class){
// do something
}
스위치 케이스를 사용할 필요 없이 Java 8 제네릭을 사용하여 런타임에 개체 인스턴스(instance)를 얻음
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
어떤 종류의 데이터라도 통과시키면, 그 방법은 당신이 전화하는 동안 통과시킨 데이터의 유형을 인쇄할 것이다.예를 들면
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
다음은 출력이다.
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []
GeneralUtils 클래스에서 블로 기능을 사용하여 유용할 수 있는지 확인하십시오.
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
getSimpleName()을(를) 사용할 수 있다.
우리에게 목표가 있다고 가정해 보자.도그 d = 새 도그(),
아래 문장으로 클래스 이름: Dog. 예:
d.getClass().getSimpleName(); // 문자열 'Dog'를 반환하십시오.
PS: d.getClass()는 대상의 전체 이름을 알려준다.
사용하다instanceof
operator
어떤 물체가 특별한 날씨를 발견하다class
그렇지 않으면.
booleanValue = (object instanceof class)
JDK 14는 연산자 인스턴스를 확장한다: 바인딩 변수를 지정할 수 있다. 연산자 인스턴스의 결과가 참이면 테스트할 객체가 바인딩 변수에 할당된다.
자세한 내용은 Java 공식 문서를 참조하십시오.
의 사용을 예시하는 샘플 프로그램instanceof
operator
:
import java.util.*;
class Foo{
@Override
public String toString(){
return "Bar";
}
}
class Bar{
public Object reference;
@Override
public String toString(){
return "Foo";
}
}
public class InstanceofUsage{
public static void main(final String ... $){
final List<Object> list = new ArrayList<>();
var out = System.out;
list.add(new String("Foo Loves Bar"));
list.add(33.3);
list.add(404_404);
list.add(new Foo());
list.add(new Bar());
for(final var o : list){
if(o instanceof Bar b && b.reference == null){
out.println("Bar : Null");
}
if(o instanceof String s){
out.println("String : "+s);
}
if(o instanceof Foo f){
out.println("Foo : "+f);
}
}
}
}
출력:
$ javac InstanceofUsage.java && java InstanceofUsage
String : Foo Loves Bar
Foo : Bar
Bar : Null
참조URL: https://stackoverflow.com/questions/541749/how-to-determine-an-objects-class
'IT이야기' 카테고리의 다른 글
Java에서 int가 null일 수 있는가? (0) | 2022.04.29 |
---|---|
Mocha 단위 테스트에서 이름에 접근하는 방법이 Vuex getter를 능가했다. (0) | 2022.04.29 |
원자 설계 패턴에서 방출하여 시각 선택에서 값을 변경하는 방법 (0) | 2022.04.29 |
vue를 사용하여 테이블 행 필터링 (0) | 2022.04.29 |
실시간 메시징 앱에서 상태 처리 (0) | 2022.04.28 |