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


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.