2012-02-24 4 views
0

클래스 이름이 Car 인 경우 특정 상황에서 다음 코드 줄을 사용할 수 있다고 해봅시다.자바 런타임 클래스 리플렉션

Car.class

내 질문은 사용자가 런타임에 클래스 이름을 제공하면 내가 전화의 유형과 동일하게 할 수있는 방법이있다. 아래에 유사한 것을 시도했으나 기쁨이 없었습니다. 내가 할 수있는 방법이 있습니까?

또한 사용자가 동적으로 캐스팅 할 수 있어야하는 개체 목록을 지정하면 동적으로 캐스팅 할 수 있어야합니다.

Car myCar = (Car) object

ClassName myObj = (ClassName) object 행을 따라 뭔가를 할 수 있도록 런타임에 클래스의 이름/유형을 사용자가 지정할 수 있어야합니다.

+1

당신이 시나리오를 줄 수, 당신이 어디에 사용할 것인가? 자바 리플렉션은 느리고 일반적으로 캐스팅에 필요하지 않습니다. 어쩌면 더 좋은 방법이 있을까요? – Tim

답변

1

질문의 성격을 감안할 때 대부분 이에 대한 답변은 Reflection API 문서에서 직접 나온 것입니다. 다음 내용을 살펴 보시기 바랍니다 : http://docs.oracle.com/javase/tutorial/reflect/class/index.html. 도움이되지 않고 특정 문제에 대한 도움이 필요한 경우이를 살펴볼 수 있습니다.

0

당신은 myObj와 상호 작용하기를 원하기 때문에 이러한 체조를 거치지 않고 객체를 갖고 자하는 상호 작용을 모델링하는 인터페이스를 추가 한 다음 코드에서 해당 인터페이스를 사용하십시오. 그런 다음 사용자가 제공 한 클래스를 검증하여 필요한 인터페이스와 오류를 적절하게 구현할 수 있습니다.

2

Class.forName("Car")은 이미 Car.class과 동일한 값을 반환합니다.

캐스팅의 경우 Class.forName("Car").cast(object)을 사용하면 Car 개체를 반환합니다. 대부분 java.lang.Class 부분 인 API를 살펴보십시오.

또한 @ runtime을 캐스팅하기 때문에 형식 안전성이 없으므로 수행하기 전에 object이 확장되는지 또는 Car을 구현하는지 확인해야합니다. 그렇지 않으면 예외가 발생합니다. A question I asked ~ a year ago and the answers there도 관련성이 있습니다. 다른 사람이 이미이 당신은 아마 더 나은 방식으로 재 설계 할 수 & 냄새가 말했듯이

는 는

비록, 자바는 유형 계층 구조를 검사해야하기 때문에 캐스팅이 유형은 일반적으로 매우 느린 것으로 노트 (그것은 필요 Car으로 전송할 수없는 경우 ClassCastException을 던져주세요.

0

표현식 Car.classCar 클래스의 java.lang.Class 개체를 반환합니다.

성명 Class.forName("Car")도 (Car 기본 패키지에 클래스를 가정) 클래스 Car에 대한 java.lang.Class 객체를 반환합니다. 참고 : 추가 할 필요가 없습니다 .class; 그게 Class 클래스 객체 인 Class 자체를 제공 할 것이고, 이는 당신이 원하는 것이 아닙니다.

클래스 Class에는 객체가 Class 인스턴스가 나타내는 클래스의 인스턴스인지 여부를 확인하는 메소드가 있습니다 (너무 혼란스럽지 않기를 바랍니다 ...).컴파일시에 클래스 Car의 이름을 알지 못하기 때문에, 어떤 종류의 컴파일 타임 타입 안전성도 가지지 않을 것입니다.

java.lang.Class의 API 설명서를 확인하십시오.

1

당신이 찾고있는 기능은 Reflection Java 프로그래밍 언어입니다.

실행중인 Java 프로그램이 프로그램 자체의 내용을 검사하거나 "내부 관찰"하고 프로그램의 내부 속성을 조작 할 수있게합니다. 예를 들어, Java 클래스가 모든 구성원의 이름을 가져 와서 표시 할 수 있습니다.

의 호출을위한 http://java.sun.com

import java.lang.reflect.*; 

    public class DumpMethods { 
     public static void main(String args[]) 
     { 
     try { 
      Class c = Class.forName(args[0]); 
      Method m[] = c.getDeclaredMethods(); 
      for (int i = 0; i < m.length; i++) 
      System.out.println(m[i].toString()); 
     } 
     catch (Throwable e) { 
      System.err.println(e); 
     } 
     } 
    } 

에서 간단한 예 :

java DumpMethods java.util.Stack 

출력은 : 여기

public java.lang.Object java.util.Stack.push(
    java.lang.Object) 
    public synchronized 
    java.lang.Object java.util.Stack.pop() 
    public synchronized 
     java.lang.Object java.util.Stack.peek() 
    public boolean java.util.Stack.empty() 
    public synchronized 
    int java.util.Stack.search(java.lang.Object) 

실행시에 오브젝트를 생성 한 예이다 :

import java.lang.reflect.*; 

    public class constructor2 { 
     public constructor2() 
     { 
     } 

     public constructor2(int a, int b) 
     { 
     System.out.println(
      "a = " + a + " b = " + b); 
     } 

     public static void main(String args[]) 
     { 
     try { 
      Class cls = Class.forName("constructor2"); 
      Class partypes[] = new Class[2]; 
      partypes[0] = Integer.TYPE; 
      partypes[1] = Integer.TYPE; 
      Constructor ct 
       = cls.getConstructor(partypes); 
      Object arglist[] = new Object[2]; 
      arglist[0] = new Integer(37); 
      arglist[1] = new Integer(47); 
      Object retobj = ct.newInstance(arglist); 
     } 
     catch (Throwable e) { 
      System.err.println(e); 
     } 
     } 
    } 

당신은 자세한 내용을보실 수 있습니다 그것에 대해 here

here - for indepth view 또한 이쪽을 봐 : What is reflection and why is it useful?

관련 문제