反射-獲取class檔案物件的三種方式

ZHOU_VIP發表於2017-06-11

package cn.itcast_01;

/*
 * 反射:就是通過class檔案物件,去使用該檔案中的成員變數,構造方法,成員方法。
 * 
 * Person p = new Person();
 * p.使用
 * 
 * 要想這樣使用,首先你必須得到class檔案物件,其實也就是得到Class類的物件。
 * Class類:
 *         成員變數    Field
 *         構造方法    Constructor
 *         成員方法    Method
 * 
 * 獲取class檔案物件的方式:
 * A:Object類的getClass()方法
 * B:資料型別的靜態屬性class
 * C:Class類中的靜態方法
 *         public static Class forName(String className) 引數是類的全路徑,如果找不到會報錯ClassNotFoundException
 * 
 * 一般我們到底使用誰呢?
 *         A:自己玩  任選一種,第二種比較方便
 *         B:開發    用第三種
 *                   為什麼呢?因為第三種是一個字串,而不是一個具體的類名。這樣我們就可以把這樣的字串配置到配置檔案中。
 */
public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        // 方式1
        Person p = new Person();
        Class c = p.getClass();

        Person p2 = new Person();
        Class c2 = p2.getClass();

        System.out.println(p == p2);// false
        System.out.println(c == c2);// true,Class檔案物件只有一個

        // 方式2
        Class c3 = Person.class;
        System.out.println(c == c3);// true

        // 方式3
        Class c4 = Class.forName("cn.itcast_01.Person");
        System.out.println(c == c4);// true
    }
}


package cn.itcast_01;

public class Person {
	
	private String name;
	int age;
	public String address;

	public Person() {
	}

	private Person(String name) {
		this.name = name;
	}

	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public Person(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}

	public void show() {
		System.out.println("show");
	}

	public void method(String s) {
		System.out.println("method " + s);
	}

	public String getString(String s, int i) {
		return s + "---" + i;
	}

	private void function() {
		System.out.println("function");
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", address=" + address
				+ "]";
	}

}


相關文章