[Java] java.lang.Class

Published: by Creative Commons Licence

참고 문서

java.lang.Class<T>

다른 모든 클래스를 정의하는 제네릭 클래스. Class 클래스의 인스턴스는 실행중인 다른 클래스나 인터페이스를 의미한다.

Class 클래스에선 다른 클래스나 인터페이스의 메타 정보를 검색할 수 있는 메서드가 제공된다. T는 이 Class 객체에 의해 모델화 되는 클래스의 형태로 예를 들어 String 클래스의 형태는 Class<String>이다. 모델화 되는 클래스가 명확하지 않는 경우 Class<?>라고 명시한다.

대부분의 메서드가 sun.java.Reflection을 통해 작동한다.

주요 메서드

forName()

static Class<?> forName( String className ): Returns the Class object associated with the class or interface with the given string name.

static Class<?> forName( String name, boolean initialize, ClassLoader loader ): Returns the Class object associated with the class or interface with the given string name, using the given class loader.

T newInstance(): Creates a new instance of the class represented by this Class object.

forName("[클래스]").newInstance()는 new 연산자가 수행하는 인스턴스 생성과 결과가 같다. 다만 newInstance()는 결과 타입이 제네릭이기 때문에 타입 변환을 명시해야 한다:

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

        Temp t = new Temp();
        t.showText();

        Temp t2 = (Temp) Class.forName("com.test.Temp").newInstance();
        t2.showText();
    }
}

class Temp {
    public void showText() {
        System.out.println("하이");
    }
}

-> 하이
-> 하이

example

JDBC 커넥션 드라이버 생성

public static Connection getConnection() {
    String url="jdbc:oracle:thin:@220.76.176.66:1521:orcl", user="noritersand", pwd="java301$!";
    if(conn == null) {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(url, user, pwd);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
    return conn;
}

클래스의 메타정보 구하기

Class cls = Class.forName("java.lang.String");

// 클래스의 메서드 리스트 출력
Method[] mthdArry = cls.getMethods();
for (Method ele : mthdArry) {
    System.out.println(ele); // 해당 클래스의 메서드를 출력할 수 있다.
}

// 특정 메서드 정보 가져오기 #1
Method mthd = cls.getMethod("toString", new Class[0]);
System.out.println(mthd.getName());
System.out.println(mthd.getModifiers());
System.out.println(mthd.getReturnType());

// 특정 메서드 정보 가져오기 #2
Method mthd2 = cls.getMethod("substring", new Class[]{int.class, int.class});
System.out.println(mthd2.getName());
System.out.println(mthd2.getModifiers());
System.out.println(mthd2.getReturnType());

클래스와 객체생성, 메서드 호출

import java.lang.reflect.Method;

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

        // Demo7 d = new Demo7()
        Class cls = Class.forName("com.test.Demo7");

        Object ob = cls.newInstance(); // 객체생성

        Demo7 d = (Demo7) ob;
        d.setName("자바");
        d.write();

        // 메서드 정의
        Method m1 = cls.getDeclaredMethod("add", new Class[] { int.class, int.class });
        Method m2 = cls.getDeclaredMethod("plus", new Class[] { Integer.class, Integer.class });
        Method m3 = cls.getDeclaredMethod("print", new Class[] { String.class, int.class });
        Method m4 = cls.getDeclaredMethod("write", null);

        // 메서드 호출
        Object o1 = m1.invoke(ob, new Object[] { 10, 20 });
        System.out.println(o1);

        // 메서드 호출2
        m3.invoke(ob, new Object[] { "합 : ", o1 });
    }
}

class Demo7 {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void write() {
        System.out.println(name);
    }

    public int add(int a, int b) {
        return a + b;
    }

    public Integer plus(Integer a, Integer b) {
        return a + b;
    }

    public void print(String title, int a) {
        System.out.println(title + a);
    }
}