Java反射---------通向高級的敲門磚

能點開這篇文章,相信你已經準備好了

那就讓我們開始讀代碼吧,我會把對代碼的理解寫入註釋中
這裏我先解釋一下什麼是字節碼對象:

字節碼文件對象包含啥?

字節文件對象
構造方法 構造方法對象(類型Constructor)
成員變量 成員變量對象(類型Field)
成員方法 成員方法對象(類型Method)

不要問我爲什麼要讀代碼,我會告訴你,代碼說的比我好,請仔細品嚐,不懂的私信我或者百度,讀代碼開始,

package com.javase.reflect.demo1;

/*
 * 0. 在一次程序運行過程中,通過同一個類創建的對象得到的字節碼文件對象是同一個
 */
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Person p = new Person();
		Person p2 = new Person();
		
		//Object getClass()
		Class class1 = p.getClass();
		Class class2 = p2.getClass();
		System.out.println(class1);
		System.out.println(class2);
		System.out.println(class2 == class1);
		
		//類型.class
		//類型:引用數據類型 還可以是基本的數據類型
		Class class3 = Person.class;
		
		
		Class class4 = int.class;
		System.out.println(class3 );
		//Class.forName("類型名(大名)")
		try {
			Class class5 = Class.forName("com.javase.reflect.demo1.Person");
			System.out.println(class1 == class5);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

總共八個Java文件加一個文本文件
剛剛是第一個,接下來有大招,注意。。。

package com.javase.reflect.demo1;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test2 {
	
	public static void main(String[] args) throws Exception {
		//讀取配置文件中的類的信息
		FileReader f = new FileReader("aa.txt");
		BufferedReader br = new BufferedReader(f);
		String str = br.readLine();
		System.out.println(str);
		
		Person p = new Person();
		
		//用字節碼文件對象來創建對象
		Class clazz = Class.forName(str);
		Constructor[] constructors = clazz.getConstructors();
		System.out.println(constructors.length);
		System.out.println(constructors[0]);
		System.out.println(constructors[1]);
		
		//用構造其對象來創建類的對象
		Constructor c =constructors[0];
//		System.out.println(c);
		Object obj = c.newInstance();
//		Person pp = (Person)obj;
//		pp.eat();
		System.out.println(obj);
	}
}

package com.javase.reflect.demo2;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*
 * 
 * 2. 得到字節碼中的成員變量對象
 */
public class Test3 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		// 1、得到成員變量對象
		Class clazz = Class.forName("com.javase.reflect.demo2.Person");
		//得到指定的Field Declared
		Field name = clazz.getDeclaredField("name");
		name.setAccessible(true);
		//傳統的屬性調用方式 對象.屬性名 屬性對象.set(對象 ,"value")
		Object obj = clazz.newInstance();
		name.set(obj, "張三");
		System.out.println(obj);
	}

}

package com.javase.reflect.demo2;

public class Person {

	//構造方法
	protected Person() {
		// TODO Auto-generated constructor stub
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	Person(String name) {
		super();
		this.name = name;
	}
	private Person(int age) {
		super();
		this.age = age;
	}
	private String name;
	private int 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 void eat() {
		System.out.println("喫飯。。。。");
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	private String method(String namString) {
		System.out.println(namString);
		return "1231";
	}
	
}

package com.javase.reflect.demo1;

/*
 * 0. 在一次程序運行過程中,通過同一個類創建的對象得到的字節碼文件對象是同一個
 */
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Person p = new Person();
		Person p2 = new Person();
		
		//Object getClass()
		Class class1 = p.getClass();
		Class class2 = p2.getClass();
		System.out.println(class1);
		System.out.println(class2);
		System.out.println(class2 == class1);
		
		//類型.class
		//類型:引用數據類型 還可以是基本的數據類型
		Class class3 = Person.class;
		
		
		Class class4 = int.class;
		System.out.println(class3 );
		//Class.forName("類型名(大名)")
		try {
			Class class5 = Class.forName("com.javase.reflect.demo1.Person");
			System.out.println(class1 == class5);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

package com.javase.reflect.demo1;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test2 {
	
	public static void main(String[] args) throws Exception {
		//讀取配置文件中的類的信息
		FileReader f = new FileReader("aa.txt");
		BufferedReader br = new BufferedReader(f);
		String str = br.readLine();
		System.out.println(str);
		
		Person p = new Person();
		
		//用字節碼文件對象來創建對象
		Class clazz = Class.forName(str);
		Constructor[] constructors = clazz.getConstructors();
		System.out.println(constructors.length);
		System.out.println(constructors[0]);
		System.out.println(constructors[1]);
		
		//用構造其對象來創建類的對象
		Constructor c =constructors[0];
//		System.out.println(c);
		Object obj = c.newInstance();
//		Person pp = (Person)obj;
//		pp.eat();
		System.out.println(obj);
	}
}

package com.javase.reflect.demo1;

public class Person {

	//構造方法
	public Person() {
		// TODO Auto-generated constructor stub
	}
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void eat() {
		System.out.println("喫飯。。。。");
	}
	@Override
	public String toString() {
		return "Person22222222";
	}
	
}

package com.javase.reflect.demo1;

public class Person2 {

	//構造方法
	public Person2() {
		// TODO Auto-generated constructor stub
	}
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public Person2(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void eat() {
		System.out.println("喫飯。。。。");
	}
	@Override
	public String toString() {
		return "Person22222222";
	}
}

學習感悟

作爲一個架構師一定要有知識的廣度和深度。

廣度:你得知道有什麼(比如你連apache的commons工具類們都不熟,還重複造輪子?還沒人家造的好)

深度:你要知道選用重點技術的底層原理以及調優方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章