Class 클래스는 컴파일된 class 파일에 저장된 클래스나 인터페이스 정보를 가져오는 데 사용한다.
반환받은 클래스가 정확히 어떤 자료형인지 모를때 Class 클래스를 이용하여서
클래스 정보를 직접 찾아야 한다.
Object 클래스의 getClass() 메서드 사용하기
String s=new String();
Class c=s.getClass();
클래스 파일 이름을 Class 변수에 직접 대입하기
Class.forName(“클래스 이름”) 메서드 사용하기
Class c=Class.forName("java.lang.String");
Person.java
package classex;
public class Person{
private String name;
private int age;
public Person(){}
public Person(String name){
this.name=name;
}
public Person(String name, int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
ClassTest.java
package classex;
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException{
Person person=new Person();
Class pClass1=person.getClass();
System.out.println(pClass1.getName());
Class pClass2=Person.class;
System.out.println(pClass2.getName());
Class pClass3=Class.forName("classex.Person");
System.out.println(pClass3.getName());
}
}
classex.Person
classex.Person
classex.Person
reflection
reflection은 Class 클래스를 활용하여 그 클래스의 정보를 가져오고,
이 정보를 활용하여 인스턴스를 생성하거나 메서드를 호출하는 방식이다.
StringClassTest.java
package classex;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class StringClassTest {
public static void main(String[] args)throws ClassNotFoundException{
Class strClass=Class.forName("java.lang.String");
Constructor[] cons=strClass.getConstructors();
for(Constructor c:cons) {
System.out.println(c);
}
System.out.println();
Field[] fields=strClass.getFields();
for(Field f:fields) {
System.out.println(f);
}
System.out.println();
Method[] methods=strClass.getMethods();
for(Method m:methods) {
System.out.println(m);
}
}
}
Class.newInstance()
Class 클래스를 이용해서 얻은 클래스 정보를 사용하여
인스턴스를 생성하기 위해서 Class.newInstance() 메서드를 사용한다.
NewInstanceTest.java
package classex;
public class NewInstanceTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
Person person1=new Person();
System.out.println(person1);
Class pClass=Class.forName("classex.Person");
Person person2=(Person)pClass.newInstance();
System.out.println(person2);
}
}
classex.Person@d716361
classex.Person@6ff3c5b5
Class.forName()
Class.forName() 메서드를 이용하여 동적 로딩(dynamic loading) 할 수 있다.
Class pClass=Class.forName("classex.Person");
String className="classex.Person";
Class pClass=Class.forName(className);