나는 String
클래스의 이름을 가지고 있습니다 "Ex"
( .class
확장자 없음 ). 다음 Class
과 같이 변수 에 할당하고 싶습니다.
Class cls = (string).class
어떻게 할 수 있습니까?
나는 String
클래스의 이름을 가지고 있습니다 "Ex"
( .class
확장자 없음 ). 다음 Class
과 같이 변수 에 할당하고 싶습니다.
Class cls = (string).class
어떻게 할 수 있습니까?
답변:
Class<?> cls = Class.forName(className);
그러나 귀하 className
는 완전한 자격을 갖추어야합니다.com.mycompany.MyClass
className
당신은 어떤 가치 를 전달하고 있습니까? 클래스 경로에 그런 클래스가 있습니까?
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 */ }
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) 을 확인하십시오.
String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName);
경우 정규화 된 클래스 이름을 매개 변수로 하드 코딩하면 문제가 해결됩니다. 어떠한 제안?
다음 forName
방법을 사용할 수 있습니다 Class
.
Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName);
경우 정규화 된 클래스 이름을 매개 변수로 하드 코딩하면 문제가 해결됩니다. 어떠한 제안?
clsName
변수에 정규화 된 클래스 이름이 포함되어 있으면 사용하는 것과 하드 코딩 된 문자열 사이에 차이가 없어야합니다. 클래스 경로에 필요한 클래스가 없을 수 있습니다. 라이브러리가 클래스 로더에 있는지 확인하기 위해 시작 코드의 동일한 jar에서 공통 클래스를 인스턴스화하는 것이 도움이 될 수 있습니다.
Class.forName()
메소드는 final
변수를 기대 합니다. 간단한 변수는 작동하지 않습니다.
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의 새 인스턴스를 만듭니다.
이것에 대한 의심이 있으면 알려주세요
무엇을 요청하는지 잘 모르겠지만 ... Class.forname , 아마도?