문자열에서 클래스 유형 가져 오기


87

나는 String클래스의 이름을 가지고 있습니다 "Ex"( .class확장자 없음 ). 다음 Class과 같이 변수 에 할당하고 싶습니다.

Class cls = (string).class

어떻게 할 수 있습니까?


수업이 다른 프로젝트에 있다면 어떨까요?
Steven

1
귀하의 의견 : What! ??? 수업이 다른 프로젝트에 있었다면 IDE에 의존하지 않습니까? 애플리케이션에 관한 한 라이브러리가 외부에서 참조되기 때문에 어쨌든 동일한 프로젝트에있는 것처럼 보일 것입니다. 마찬가지로 Java API 클래스가 프로젝트에 없다는 것을 알고 있습니까? 그러나 IDE가 올바르게 설정된 경우 IDE 용 컴파일러는이를 찾을 위치를 알고 있습니다. 다른 프로젝트의 수업에도 동일하게 적용됩니다.
user919860

답변:


168
Class<?> cls = Class.forName(className);

그러나 귀하 className는 완전한 자격을 갖추어야합니다.com.mycompany.MyClass


2
던지는 ClassNotFound 예외
Steven

1
다음 중 하나를 클래스는 클래스 경로에없는하거나 정규화 된 클래스 이름 예를 들어 com.mycompany.project.ClassName 전달되지 않습니다
한스 Westerbeek

className당신은 어떤 가치 를 전달하고 있습니까? 클래스 경로에 그런 클래스가 있습니까?
Bozho 2010 년

네 클래스는 같은 패키지에 있습니다
Steven

1
나는 ClassNotFoundException. 트릭은 try-catch에서 예외를 처리하는 것이 었습니다. 이와 같은 것 :try { Class<?> cls = Class.forName("com.company.MyClass"); } catch (ClassNotFoundException ex) { /* do something to handle the case when the string isn't valid and therefor the class can't be found */ }
kumaheiyama

43
String clsName = "Ex";  // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();

자세한 내용 은 Reflection에 대한 Java Tutorial 추적 ( http://java.sun.com/docs/books/tutorial/reflect/TOC.html) 을 확인하십시오.


3
Bozho의 답변에는 더 많은 포인트가있을 수 있지만 귀하의 답변이 더 설명 적이라고 생각합니다. 추신. 당신의 이름은 왜 JuanZe입니까 ??? 거의 스페인어와 중국어의 혼합처럼 들립니다. :디. 그 뒤에 어떤 종류의 영리한 의미가 있습니까?
user919860

이클립스에서 동적 웹 프로젝트로 작업하고 있습니다. 위의 코드를 사용하여 클래스를 가져오고 있습니다. 하지만 다음과 같은 문자열 변수를 사용할 때 ClassNotFoundException을 반환합니다.이 String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); 경우 정규화 된 클래스 이름을 매개 변수로 하드 코딩하면 문제가 해결됩니다. 어떠한 제안?
Dibyanshu Jaiswal 2015

8

다음 forName방법을 사용할 수 있습니다 Class.

Class cls = Class.forName(clsName);
Object obj = cls.newInstance();

이클립스에서 동적 웹 프로젝트로 작업하고 있습니다. 위의 코드를 사용하여 클래스를 가져오고 있습니다. 하지만 다음과 같은 문자열 변수를 사용할 때 ClassNotFoundException을 반환합니다.이 String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); 경우 정규화 된 클래스 이름을 매개 변수로 하드 코딩하면 문제가 해결됩니다. 어떠한 제안?
Dibyanshu Jaiswal 2015

@djthequest clsName변수에 정규화 된 클래스 이름이 포함되어 있으면 사용하는 것과 하드 코딩 된 문자열 사이에 차이가 없어야합니다. 클래스 경로에 필요한 클래스가 없을 수 있습니다. 라이브러리가 클래스 로더에 있는지 확인하기 위해 시작 코드의 동일한 jar에서 공통 클래스를 인스턴스화하는 것이 도움이 될 수 있습니다.
rsp

귀하의 응답에 감사드립니다. 그러나 문자열을 하드 코딩하고 핀을 작동하면 변수 대신 클래스가 클래스 경로에 있음을 의미합니다. 나중에 내가 알아 냈는데 Class.forName()메소드는 final변수를 기대 합니다. 간단한 변수는 작동하지 않습니다.
Dibyanshu Jaiswal 2015

4

Java Reflection Concept을 통해 런타임 중에 모든 클래스의 클래스 참조를 얻을 수 있습니다.

아래 코드를 확인하십시오. 아래에 설명이 나와 있습니다.

다음은 반환 된 Class를 사용하여 AClass의 인스턴스를 만드는 한 가지 예입니다.

package com.xyzws;
class AClass {
    public AClass() {
        System.out.println("AClass's Constructor"); 
    }  
    static {   
        System.out.println("static block in AClass");  
    }
}
public class Program {   
    public static void main(String[] args) {
        try {       
            System.out.println("The first time calls forName:");   
            Class c = Class.forName("com.xyzws.AClass");      
            AClass a = (AClass)c.newInstance();    
            System.out.println("The second time calls forName:");  
            Class c1 = Class.forName("com.xyzws.AClass"); 
        } catch (ClassNotFoundException e) { 
            // ...
        } catch (InstantiationException e) {  
            // ...
        } catch (IllegalAccessException e) { 
            // ...
        }     
    }
}

인쇄 된 출력은

    The first time calls forName:
    static block in AClass
    AClass's Constructor
    The second time calls forName:

클래스가 이미로드되었으므로 두 번째 "AClass에 정적 블록"이 없습니다.

설명은 다음과 같습니다.

Class.ForName은 클래스 객체를 얻기 위해 호출됩니다.

Class Object를 사용하여 Class의 새 인스턴스를 만듭니다.

이것에 대한 의심이 있으면 알려주세요


수업이 다른 프로젝트에 있다면 어떨까요?
Steven

1
해당 proect의 jar 파일을 가져 와서 Class.forName ( "oracle.jdbc.driver.OracleDriver")과 같은 클래스 이름을 지정할 수 있습니까?
gmhk

3

그것은해야한다:

Class.forName(String classname)


서브 클래스에 대해서도이 작업을 수행 할 수 있습니까?
Gobliins

2

무엇을 요청하는지 잘 모르겠지만 ... Class.forname , 아마도?


던지는 ClassNotFound 예외
Steven

수업이 다른 프로젝트에 있다면 어떨까요?
Steven

1
아무도 당신의 질문에 대답하지 않는 것을 알고 있습니다. 컴파일러가 찾을 위치를 알고있는 한 다른 프로젝트에 있는지 여부는 중요하지 않습니다. 아마도 IDE를 사용하고 있기 때문에 아마도 IDE에만 의존 할 것입니다. 참조에 관한 것은 Java 라이브러리에서 참조하는 모든 클래스가 프로젝트에 없다는 것을 알고 있습니까? 그러나 컴파일러는 외부에서 참조된다는 것을 알고 있기 때문에 찾을 위치를 알고 있습니다. 고급 자바 프로그래밍을 시도 할 때 기본적인 자바 프로그래밍을 배워야 할 것 같습니다. : |
user919860
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.