자바

JAVA 자바 Class 객체 얻기 getClass(), forName() /// 리플렉션 getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods()

알통몬_ 2017. 3. 15. 10:33
반응형

안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ 

Class 클래스

 자바는 클래스와 인터페이스의 메타 데이터를 java.lang 패키지에 소속된 Class 클래스로 관리합니다. 여기서 메타 데이터란 클래스의 이름, 생성자 정보, 필드 정보, 메서드 정보를 말합니다.


Class 객체 얻기 getClass(), forName()

 프로그램에서 Class 객체를 얻기 위해서는 Object 클래스의 getClass() 메서드를 이용하면 됩니다. 

모든 클래스에서 getClass() 메서드를 호출할 수 있습니다.

Class clazz = obj.getClass();


getClass() 메서드는 해당 클래스로 객체를 생성했을 때만 사용할 수 있습니다. 

객체를 생성하기 전에 직접 Class 객체를 얻을 수도 있습니다. 

Class는 생서자를 감추고 있기 때문에 new 연산자로 객체를 만들 수 없고 

정적 메서드는 forName()을 이용해야 합니다. 

forName() 메서드는 클래스 전체 이름(패키지가 포함된 이름) 을 매개값으로 받고 

Class 객체를 리턴합니다.

try{

  Class clazz = Class.forName(String ClassName);

} catch(ClassNotFoundException e){

}


Class.forName() 메서드는 매개값으로 주어진 클래스를 찾지 못하면 

ClassNotFoundException 예외를 발생시키기 때문에 예외 처리가 필요.


예제)

public class Car {

 

}



public class ClassExample {

public static void main(String[] args) {

Car car = new Car();

Class clazz1 = car.getClass();

System.out.println(clazz1.getName());

System.out.println(clazz1.getSimpleName());

System.out.println(clazz1.getPackage().getName());

System.out.println();

try {

Class clazz2 = Class.forName("sec06.exam01_class.Car");

System.out.println(clazz2.getName());

System.out.println(clazz2.getSimpleName());

System.out.println(clazz2.getPackage().getName());

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

 

}

-------------------------------------------------------------------------------------


리플렉션 getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods()

 리플렉션 : Class 객체를 이용하면 클래스의 생성자, 필드, 메서드 정보를 알아낼 수 있습니다.  Class 객체는 리플렉션을 위해

getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods() 를 제공합니다.

Constructor[] constructors = clazz.getDeclaredConstructors();

Field[] fields = clazz.getDeclaredFields();

Method[] methods = clazz.getDeclaredMethods();


위 메서드는 각각 생성자 배열, 필드 배열, 메서드 배열을 리턴합니다. 

Constructor, Field, Method 클래스는 java.lamg.reflect 패키지에 소속되어 있습니다.

getDeclaredFields(), getDeclaredMethods()는 클래스에 선언된 멤버만 가져옵니다.

상속된 멤버도 얻고 싶다면 getFields(), getMethods() 를  이용하면 됩니다. 

getFields(), getMethods()는 public 멤버만 가져옵니다. 


예제)

클래스1

public class Car {

private String model;

public String owner;

public Car() {

}

public Car(String model) {

this.model = model;

}

public void setModel(String model) {

this.model = model;

}

public String getModel() {

return model;

}

private void setOwner(String owner) {

this.owner = owner;

}

public String getOwner() {

return owner;

}

 

 }


실행 클래스

import java.lang.reflect.*;


public class ReflectionExample {

public static void main(String[] args) throws Exception {

Class clazz = Class.forName("sec06.exam02_reflection.Car");

System.out.println("[클래스 이름]");

System.out.println(clazz.getName());

System.out.println();

System.out.println("[생성자 정보]");

Constructor[] constructors = clazz.getDeclaredConstructors();

for(Constructor constructor : constructors) {

System.out.print(constructor.getName() + "(");

Class[] parameters = constructor.getParameterTypes();

printParameters(parameters);

System.out.println(")");

} // 생성자 이름과 매개 변수 정보를 출력

System.out.println();

System.out.println("[필드 정보]");

Field[] fields = clazz.getDeclaredFields();

for(Field field : fields) {

System.out.println(field.getType().getSimpleName() + " " + field.getName());

} // 필드 타입과 필드 이름을 출력

System.out.println();

System.out.println("[메소드 정보]");

Method[] methods = clazz.getDeclaredMethods();

for(Method method : methods) {

System.out.print(method.getName() + "(");

Class[] parameters = method.getParameterTypes();

printParameters(parameters);

System.out.println(")");

}// 메서드 이름과 매개 변수를 출력

}

private static void printParameters(Class[] parameters) {

for(int i=0; i<parameters.length; i++) {

System.out.print(parameters[i].getName());

if(i<(parameters.length-1)) {

System.out.print(",");

}

}// 매개 변수 정보를 출력하는 공통 코드입니다.

}

 

}

반응형