反射是java的高級特性,充分利用了JVM的解釋機制。和泛型、註解構成了Java最獨特的特性,出現了各類增長代碼複用的設計思想,直接致使java生態圈豐富框架的出現,其中最出名的是IOC思想的spring。使用的.java文件在編譯器編譯後成 .class 字節碼。而後在classloader的時候會將.class 文件加載並解析到永久區,並在運行時調用class類的方法。java
a) java.lang.Class:所用的反射的基礎,class在建立的時候都是存放在該類下面,從而JVM能夠在運行時使用,操做類的數據。spring
b) java.lang.reflect.*:class每個部分的組成都在這個包。例如:構造器、屬性框架
a)組成:訪問修飾符、類型、超類、接口、泛型類型、屬性、方法、註解ide
b)全部超類、接口、類以及實例都是class的子類(在內存中,全部的class內容,除去邏輯代碼部分,都是掛載在java.lang.class上面)。spa
/** * @see 反射接口 * @author ssHss * */ public class TestReflect<Lang> extends Reflect1 implements ReIn { private String hello1; public String hello2; public static void main(String[] args) throws Exception { Class<?> c = Class.forName("reflect.TestReflect"); // 查找以 TestReflect的.class 文件對象 Object o = c.newInstance(); // 獲取實例 System.out.println("類型:" + c.getTypeName()); System.out.println("field"); // 屬性 Field[] files = c.getFields(); for (Field field : files) { System.out.println("屬性名 :" + field.getName() + " 類型 :" + field.getGenericType()); } // 公告屬性 Field[] declearFiles = c.getDeclaredFields(); for (Field field : declearFiles) { System.out.println("屬性名 :" + field.getName() + " 類型 :" + field.getGenericType()); } System.out.println("method"); // 全部方法 Method[] methods = c.getMethods(); for (Method method : methods) { System.out.println("方法名 :" + method.getName() + " 類型 :" + method.getGenericReturnType()); method.setAccessible(true);// 使用私有方法 for (Parameter params : method.getParameters()) { System.out.println("方法參數 :" + params.getName() + " 類型 :" + params.getType()); } } // 公共方法 Method[] declearedMethods = c.getDeclaredMethods(); for (Method method : declearedMethods) { System.out.println("公共方法名 :" + method.getName() + " 返回類型 :" + method.getGenericReturnType()); for (Parameter params : method.getParameters()) { System.out.println("公共方法參數 :" + params.getName() + " 返回類型 :" + params.getType()); } } System.out.println("annotation"); // 所用註解 Annotation[] annotation = c.getAnnotations(); for (Annotation anno : annotation) { System.out.println("註解 :" + anno.toString()); } // 公告註解 Annotation[] declearedAnnotation = c.getDeclaredAnnotations(); for (Annotation a : declearedAnnotation) { System.out.println("公告註解 :" + a.toString()); } TypeVariable<?>[] ces = c.getTypeParameters(); for (TypeVariable<?> typeVariable : ces) { System.out.println("泛型:" + typeVariable.getName()); } System.out.println("superClass"); System.out.println("superClass"); // 超類(父類和接口) Class<?> suc = c.getSuperclass(); System.out.println("超類:" + suc.getName() + " 類型: " + suc.getTypeName()); System.out.println("超類屬性"); Field[] superFiles = suc.getFields(); for (Field field : superFiles) { System.out.println("超類屬性:" + field.getName()); } System.out.println("超類屬性"); TypeVariable<?>[] classes = suc.getTypeParameters(); for (TypeVariable<?> typeVariable : classes) { System.out.println("超類泛型:" + typeVariable.getName()); } System.out.println("接口"); Class<?>[] intefs = c.getInterfaces(); for (Class<?> ints : intefs) { System.out.println("接口:" + ints.getName() + " 接口: " + ints.getTypeName()); for (TypeVariable<?> intsp : ints.getTypeParameters()) { System.out.println("接口泛型: " + intsp.getTypeName()); } } } @Override public void getInterface() { // TODO Auto-generated method stub } @Override public void getInterface(int over) { // TODO Auto-generated method stub } } class Reflect1<Integer, Byte, Charactor> { public String he; public String hello4; } interface ReIn<Short> { static int intefaceNumber = 9; void getInterface(); void getInterface(int over); }