IT이야기

개체의 클래스를 결정하는 방법

cyworld 2022. 4. 29. 23:10
반응형

개체의 클래스를 결정하는 방법

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

반응형