Java基础-反照功能部分代码示例

Java基础-反射功能部分代码示例
最近准备深入研究一下Spring的内部实现原理,所以先把Java的反射功能相关的东西复习一下。写了一点代码,都是些很简单的东西。第一部分是向JavaBean的属性中赋值。第二部分是从JavaBean的属性中取值。注释和运行结果都贴在代码中。不明白的可以留言询问。
package com.procetier.study.reflect;

public class BookBean {

	/**
	 * 「名称」
	 */
	private String name;

	/**
	 * 「作者」
	 */
	private String author;

	/**
	 * 「版本」
	 */
	private String version;

	/**
	 * 「出版社」
	 */
	private String publication;

	public void information() {
		System.out.println("书名:" + this.name + ";作者:" + this.author + ";版本:"
				+ this.version + ";出版社" + this.publication);
	}

	public BookBean() { }

	public BookBean(final String name, final String author,
			final String version, final String publication) {
		super();
		this.name = name;
		this.author = author;
		this.version = version;
		this.publication = publication;
	}

	public String getName() {
		return this.name;
	}

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

	public String getAuthor() {
		return this.author;
	}

	public void setAuthor(final String author) {
		this.author = author;
	}

	public String getVersion() {
		return this.version;
	}

	public void setVersion(final String version) {
		this.version = version;
	}

	public String getPublication() {
		return this.publication;
	}

	public void setPublication(final String publication) {
		this.publication = publication;
	}
}

package com.procetier.study.reflect;

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

public class TestReflect {
	public static void main(String[] args) throws Exception {
		BookBean bookBean = init();
		//bookBean.information();
		// result
		// == > 书名:《深入理解Java虚拟机》;作者:周志明;版本:1.0;出版社机械工业出版社
		
		exp(bookBean);
	}

	public static BookBean init() throws Exception {
		// 获取类加载器
		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		// 加载BookBean类
		Class cls = classLoader.loadClass("com.procetier.study.reflect.BookBean");
		
		// ①
		// 获取类的默认构造器
		Constructor cons = cls.getDeclaredConstructor((Class[])null);
		// 实例化BookBean
		BookBean bookBean = (BookBean)cons.newInstance();
		// ②实例化BookBean方法2
		//BookBean bookBean = (BookBean)cls.newInstance();
		// 取得Class中的所有方法
		getAllMethod(cls);
		
		// 通过反射方法设置属性
		Method setName = cls.getMethod("setName", String.class);
		setName.invoke(bookBean, "《深入理解Java虚拟机》");
		Method setAuthor = cls.getMethod("setAuthor", String.class);
		setAuthor.invoke(bookBean, "周志明");
		Method setVersion = cls.getMethod("setVersion", String.class);
		setVersion.invoke(bookBean, "1.0");
		Method setPublication = cls.getMethod("setPublication", String.class);
		setPublication.invoke(bookBean, "机械工业出版社");
		
		return bookBean;
	}
	
	/**
	 * 取得Class中的所有方法
	 * @param cls
	 */
	public static void getAllMethod(Class cls) {
		Method[] methods = cls.getMethods();
		for (Method method : methods) {
			//System.out.println(method);
		}
//		result
//		public void com.procetier.study.reflect.BookBean.information()
//		public java.lang.String com.procetier.study.reflect.BookBean.getAuthor()
//		public void com.procetier.study.reflect.BookBean.setAuthor(java.lang.String)
//		public void com.procetier.study.reflect.BookBean.setVersion(java.lang.String)
//		public java.lang.String com.procetier.study.reflect.BookBean.getPublication()
//		public void com.procetier.study.reflect.BookBean.setPublication(java.lang.String)
//		public java.lang.String com.procetier.study.reflect.BookBean.getName()
//		public void com.procetier.study.reflect.BookBean.setName(java.lang.String)
//		public java.lang.String com.procetier.study.reflect.BookBean.getVersion()
//		public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
//		public final void java.lang.Object.wait() throws java.lang.InterruptedException
//		public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
//		public boolean java.lang.Object.equals(java.lang.Object)
//		public java.lang.String java.lang.Object.toString()
//		public native int java.lang.Object.hashCode()
//		public final native java.lang.Class java.lang.Object.getClass()
//		public final native void java.lang.Object.notify()
//		public final native void java.lang.Object.notifyAll()
	}

	public static <T> void exp(T t) throws Exception {
		// 运行时的Class
		Class cls = t.getClass();
		// 取得当前Class中的所有属性
		Field[] fields = cls.getDeclaredFields();
		// 遍历结果
//		for (Field fie : fields) {
//			System.out.println(fie);
//			private java.lang.String com.procetier.study.reflect.BookBean.name
//			private java.lang.String com.procetier.study.reflect.BookBean.author
//			private java.lang.String com.procetier.study.reflect.BookBean.version
//			private java.lang.String com.procetier.study.reflect.BookBean.publication
//		}
		
		// 取得Bean的值
		for (int i = 0, j = fields.length; i < j; i++) {
			Field field = fields[i];
			// 取得属性名称
			String fieldName = field.getName();
			// 类型 getXxxx
			String fieMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
			// 取得对应的get方法
			Method method = cls.getMethod(fieMethodName);
			// 取出值
			System.out.println(method.invoke(t));
		}
	}
}