Java反射拾遺,java拾遺
定義:Java反射機制可以讓我們在編譯期(Compile Time)之外的運行期(Runtime)檢查類,介面,變數以及方法的資訊。
反射還可以讓我們在運行期執行個體化對象,調用方法,通過調用get/set方法擷取變數的值。
反射作用:使用Java反射機制可以在運行時期檢查Java類的資訊,檢查Java類的資訊往往是你在使用Java反射機制的時候所做的第一件事情,
通過擷取類的資訊你可以擷取以下相關的內容
Class對象
類名
修飾符
包資訊
父類
實現的介面
構造器
方法
變數
註解
Class對象:
反射擷取class對象兩種方式
Class.forName("類名全稱");
forName是Class對象的靜態方法,會裝入類,並做類的靜態初始化,返回Class的對象。
類名.class;
JVM將使用類裝載器, 將類裝入記憶體(前提是:類還沒有裝入記憶體),不做類的初始化工作.返回Class的對象。
具體的參考如下代碼:
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)@Lazypublic 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@ToStringpublic class ReflectBeanSuper { private String sex;}
public interface ReflectInterface { String getReflectName();}
運行結果
這裡寫的比較簡單,都在代碼裡體現了,如果需要具體的操作可以在參考相關API