原文連接http://zhhll.icu/2020/08/17/java%E5%9F%BA%E7%A1%80/%E5%8F%8D%E5%B0%84/%E5%8F%8D%E5%B0%84/java
Java提供反射來在運行時狀態下動態的獲取類的屬性、方法等信息,在框架中不少地方都應用到了反射框架
獲取Class對象的四種方式code
// 第一種 Class<Person> clazz = Person.class; // 第二種 Person person = new Person(); Class clazz1 = person.getClass(); // 第三種 String className = "com.zhanghe.study.reflect.Person"; Class clazz2 = Class.forName(className); // 第四種 使用類加載器 ClassLoader classLoader = TestClass.class.getClassLoader(); Class clazz3 = classLoader.loadClass(className);
Class clazz = TestConstructor.class; Constructor[] constructors = clazz.getConstructors(); System.out.println("=========clazz.getConstructors()====只能獲取到公有的構造器"); for(Constructor constructor : constructors){ System.out.println(constructor); } System.out.println("*****************"); System.out.println("=========clazz.getConstructor()=====獲取公有無參構造器"); Constructor constructor = clazz.getConstructor(); System.out.println(constructor); System.out.println("*****************"); System.out.println("=========clazz.getDeclaredConstructors()=====獲取全部構造器(包括私有、受保護、默認、公有)"); Constructor[] declaredConstructors = clazz.getDeclaredConstructors(); for(Constructor declaredConstructor : declaredConstructors){ System.out.println(declaredConstructor); } System.out.println("*****************"); System.out.println("=========clazz.getDeclaredConstructor()====獲取指定參數類型的構造器"); Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class); System.out.println(declaredConstructor); System.out.println("*****************");
System.out.println("======getFields==========="); // 獲取全部的屬性 只能獲取到該類和父類中public的 Field[] fields = clazz.getFields(); for (Field f : fields){ System.out.println(f.getName()); } System.out.println("======getDeclaredFields==========="); // 獲取全部的屬性 本類中聲明的全部的屬性均可以獲取到,不能夠獲取到父類的 Field[] declaredFields = clazz.getDeclaredFields(); for (Field f : declaredFields){ // 獲取權限修飾符 int i = f.getModifiers(); String m = Modifier.toString(i); System.out.println("Modifier:"+m); // 獲取屬性類型 Class type = f.getType(); System.out.println("type:"+type.getTypeName()); // 獲取屬性名 System.out.println("name:"+f.getName()); }
System.out.println("======getMethods==========="); // 獲取本類和父類中全部的public方法 Method[] methods = clazz.getMethods(); for(Method m : methods){ System.out.println(m.getName()); } System.out.println("======getDeclaredMethods==========="); // 獲取本類中全部的方法,包括私有方法 父類的沒法獲取 Method[] declaredMethods = clazz.getDeclaredMethods(); for(Method m : declaredMethods){ // 獲取註解 Annotation[] annotations = m.getAnnotations(); // 權限修飾符 System.out.println("Modifier:"+Modifier.toString(m.getModifiers())); // 返回值類型 Class reture = m.getReturnType(); // 形參列表 Class[] params = m.getParameterTypes(); // 方法名 System.out.println(m.getName()); // 異常類型 Class[] exceptions = m.getExceptionTypes(); }
// 獲取父類 Class superClass = clazz.getSuperclass(); // 獲取帶泛型的父類 Type superType = clazz.getGenericSuperclass(); // 獲取父類的泛型 if(superType instanceof ParameterizedType){ // 若是存在泛型 Type[] actualTypeArguments = ((ParameterizedType) superType).getActualTypeArguments(); }
// 獲取實現的接口 Class[] interfaces = clazz.getInterfaces();
// 獲取所在的包 Package aPackage = clazz.getPackage();
// 獲取註解 Annotation[] annotations = clazz.getAnnotations();
// 經過反射建立person實例 Person person = clazz.newInstance(); // 經過反射獲取類的age屬性,並賦值 Field field = clazz.getDeclaredField("age"); field.setAccessible(true); field.set(person,20);
// 經過反射獲取方法,並調用 Method method = clazz.getMethod("display"); method.invoke(person);
因爲自己的博客百度沒有收錄,博客地址http://zhhll.icu對象