[Java]Classクラス


クラス#クラス#


  • コンパイルされたクラスファイルをロードしてオブジェクトを動的にロードし、情報を取得する方法を提供するクラス.

  • Class.クラスはforName(クラス名)メソッドで動的にロードできます.
  • Class c = Class.forName("java.lang.String");
    // java.lang.String에 대한 클래스를 동적 로딩으로 가져오는 코드
    ダイナミックロード
    コンパイル時にデータ型をバインドするのではなく、実行時にデータ型をバインドする方法です.動的ロード方法の利点は、プログラミング時に文字列変数として処理でき、実行時に必要なクラスをロードしてバインドできることですが、コンパイル時にタイプを特定できず、エラーが発生するとプログラムに障害が発生します.
  • と同様のコードをReflection Programmingと呼びます.ローカルに対応するオブジェクトがない場合、リモートオブジェクトやクラスをインポートする必要がある場合は、上記のコードなどの反射プログラミングでこれらのメソッドを呼び出します.
  • package ch04;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
    
    
    public class StringTest {
    	public static void main(String[] args) throws ClassNotFoundException {
    		
    		Class c = Class.forName("java.lang.String");
    		
    		Constructor[] cons = c.getConstructors();
    		for (Constructor co: cons) {
    			System.out.println(co);
    		}
    		
    		Method[] m = c.getMethods();
    		for (Method method: m) {
    			System.out.println(method);
    		}
    		
    	}
    }

    Reflection Programming


  • クラスを使用して、クラスの情報(ジェネレータ、変数、メソッド)、インスタンスの作成、メソッドの呼び出しのプログラミングを理解します.

  • 通常、ローカルメモリで使用しないオブジェクトがない場合は、リモートプログラミングでオブジェクトのタイプが不明な場合に使用します.
    (一般的には、データ型を知っている場合は使用しません)

  • java.lang.reflectは、パッケージ内のクラスを使用してプログラミングされます.
  • 👨🏻‍💻 Example Code


    Person.java
    package ch04;
    
    public class Person {
    	private String name;
    	private int age;
    	
    	public Person() {}
    	
    	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;
    	}
    	
    	public String toString() {
    		return name;
    	}
    }
    ClassTest.java
    package ch04;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    public class ClassTest {
    
    	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, 
    	IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
    		// TODO Auto-generated method stub
    		Class c1 = Class.forName("ch04.Person");
    		
    		Person person = (Person)c1.newInstance();
    		// 11~13번째 줄 코드는 Person person = new Person(); 와 같은 코드이다.
    		
    		person.setName("Lee");
    		System.out.println(person);
    
    		
    		// 이미 인스턴스가 있는 상태면 getClass를 통해 class를 불러올 수 있다.
    		Class c2 = person.getClass();
    		Person p = (Person)c2.newInstance();
    		// newInstance를 통해 인스턴스를 생성하면 default constructor로 생성하게 된다.
    		System.out.println(p);
    		
    		
    		Class[] parameterTypes = {String.class};
    		Constructor cons = c2.getConstructor(parameterTypes); 
    		// 위의 코드를 통해 parameterType에 있는 constructor를 찾게된다.
    		
    		Object[] initargs = {"Kim"};
    		Person kimPerson = (Person)cons.newInstance(initargs);
    		System.out.println(kimPerson);
    		
    		// 21, 27~33번째 줄 코드는 Person person = new Person("Kim"); 와 같은 코드이다.
    		
    		// 위의 코드들은 일반적으로 사용하지 않고 local에 Person이라는 class가 없어서 
    		// constructor정보를 가져와 그 정보를 이용해 생성할 때 사용한다.
    
    	}
    
    }
    

    Reference

  • 「Fast Campas」を一度に完了したJava/spring Web開発主ハイパーパケットオンライン.