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);// 实例化BookBeanBookBean 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 {// 运行时的ClassClass 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();// 类型 getXxxxString fieMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);// 取得对应的get方法Method method = cls.getMethod(fieMethodName);// 取出值System.out.println(method.invoke(t));}}}