定義:Java反射機制能夠讓咱們在編譯期(Compile Time)以外的運行期(Runtime)檢查類,接口,變量以及方法的信息。
反射還能夠讓咱們在運行期實例化對象,調用方法,經過調用get/set方法獲取變量的值。ide
反射做用:使用Java反射機制能夠在運行時期檢查Java類的信息,檢查Java類的信息每每是你在使用Java反射機制的時候所作的第一件事情,
經過獲取類的信息你能夠獲取如下相關的內容this
Class對象
類名
修飾符
包信息
父類
實現的接口
構造器
方法
變量
註解spa
Class對象:
反射獲取class對象兩種方式
Class.forName("類名全稱");
forName是Class對象的靜態方法,會裝入類,並作類的靜態初始化,返回Class的對象。code
類名.class;
JVM將使用類裝載器, 將類裝入內存(前提是:類尚未裝入內存),不作類的初始化工做.返回Class的對象。對象
具體的參考以下代碼:blog
Class<?> bean = Class.forName("com.*.common.ReflectBean"); ReflectBean reflectBean = (ReflectBean) bean.newInstance(); System.out.println("實例1" + reflectBean); Class<?> bean1 = ReflectBean.class; ReflectBean reflectBean1 = (ReflectBean) bean1.newInstance(); System.out.println("實例2" + reflectBean1); int modifiers = bean.getModifiers(); System.out.println("類的修飾符" + modifiers); System.out.println("類的修飾符是否爲public" + Modifier.isPublic(modifiers)); System.out.println("類的全名" + bean.getName()); System.out.println("類的簡名" + bean.getSimpleName()); Package packageInfo = bean.getPackage(); System.out.println("類的包信息" + packageInfo); Class superClass = bean.getSuperclass(); System.out.println("類的父類" + superClass.getName()); for (Class interFace : bean.getInterfaces()) { System.out.println("類的接口" + interFace.getName()); } for (Constructor interFace : bean.getConstructors()) { System.out.println("類的構造方法" + interFace.getName()); } for (Method interFace : bean.getMethods()) { System.out.println("類的方法" + interFace.getName()); } for (Field interFace : bean.getFields()) { System.out.println("類的公共變量" + interFace.getName()); } for (Annotation annotation : bean.getAnnotations()) { // 此處沒註解是由於 setter getter 等都是編譯時期的 這拿到的是運行期的 System.out.println("類的註解" + annotation.toString()); }
@Getter @Setter @ToString(callSuper = true) @Lazy public class ReflectBean extends ReflectBeanSuper implements ReflectInterface { public String name; public ReflectBean () { } public ReflectBean (String name) { this.name = name; } @Override public String getReflectName() { return name; } }
@Getter @Setter @ToString public class ReflectBeanSuper { private String sex; }
public interface ReflectInterface { String getReflectName(); }
運行結果如圖:接口
這裏寫的比較簡單,都在代碼裏體現了,若是須要具體的操做能夠在參考相關API內存