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