认识反射
認識反射
13.1.反射是什么,有什么作用?
? ? ?反射---在程序運行的過程中,我們可以得到某個類的對象,可以調用某個類中的任何一個變量/方法,這種動態獲取信息的過程就是反射。當我們在沒有見過某個類的情況下,僅憑一個完整的
類名,就可以獲取到整個類的所有信息。
? ? ?反射的使用場景:
13.2.實例對象與反射對象的相互轉換?
? ? ?實例對象-----就是我們通過類創建的對象
? ? ?反射對象-----通過反射機制得到的類對象
? ? ?例如: ?反射就是一面鏡子,鏡子前面的你就是實例對象,通過鏡子得到的鏡子里面的你就是反射對象。
? ? ?反射對象是一個Class類型的對象
? ? ?Class---不是創建類的關鍵字,表示一個類,所以反射對象是一個Class類型的對象? ? ? ??public final class Class<T
package com.wangxing.test1;public class TestMain {public static void main(String[] args) {/*//得到反射對象//1.通過實例對象得到反射對象 [getClass()]Student stu=new Student();Class stuclass=stu.getClass();//2通過Class類的forname(類名【包名+類名】)try {Class stuclass2=Class.forName("com.wangxing.test1.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}*///通過反射對象得到實例對象 [newInstance()]//Student stu=new Student();//stu.test1();try {Class stuclass2=Class.forName("com.wangxing.test1.Student");Student stu=(Student)stuclass2.newInstance();stu.test1();} catch (Exception e) {e.printStackTrace();}}}13.3.通過反射對象得到構造方法\成員變量\成員方法
| Constructor<?>[] | getConstructors() 得到構造方法 | |
| Field[] | getDeclaredFields() 得到成員變量 | |
| Method[] | getDeclaredMethods() 得到成員方法 | |
| Class<?>[] | getInterfaces() 得到接口。 | |
| Class<? super T> | getSuperclass() 得到父類。 | |
| Package | getPackage() 得到包對象。 | |
| int | getModifiers() Java語言修飾符 Modifier的toString(int?mod) | |
| String | getName() 得到類名稱 | |
13.4反射的應用
? ? ? ?父類:
package com.wangxing.test1;public class Person {}? ? ? ?接口:
package com.wangxing.test1;public interface MyTestInterface {}? ? ? 子類且實現接口:
package com.wangxing.test1; public class Student extends Person implements MyTestInterface{private String stuname;private int stuage;public Student(){}public Student(String name){this.stuname=name;}public void test1(){System.out.println("Student類的實例方法");}public String testString(String args){return "hello";} }? ? ? ? 通過反射得到類中的變量和方法:
package com.wangxing.test1;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier;//通過反射得到與Student類一樣的java類 public class TestMain2 {public static String testName(String classname){return classname.substring(classname.lastIndexOf(".")+1);}public static void main(String[] args)throws Exception {Class stuclass2=Class.forName("com.wangxing.test1.Student");//得到Student類的包名String pagename=stuclass2.getPackage().getName();String packageinfo="package "+pagename+";";System.out.println(packageinfo);//得到Student類的定義信息String classxiushifu=Modifier.toString(stuclass2.getModifiers());String leiming=testName(stuclass2.getName());String supername=testName(stuclass2.getSuperclass().getName());Class interfacearr[]=stuclass2.getInterfaces();StringBuilder interinfo=new StringBuilder();for(Class inter:interfacearr){String intername=testName(inter.getName());interinfo.append(intername+",");}interinfo.deleteCharAt(interinfo.length()-1);String classinfo=classxiushifu+" class "+leiming+" extends "+supername+" implements "+interinfo.toString()+"{";System.out.println(classinfo);//得到類中的成員變量Field fieldarr[]=stuclass2.getDeclaredFields();for(Field field:fieldarr){String fieldxiu=Modifier.toString(field.getModifiers());String fieldleixing=testName(field.getType().getName());String fieldname=field.getName();String fieldinfo=fieldxiu+" "+fieldleixing+" "+fieldname+";";System.out.println("\t"+fieldinfo);}//得到類中的構造方法Constructor constructorarr[]=stuclass2.getConstructors();for(Constructor con:constructorarr){String conxiu=Modifier.toString(con.getModifiers());String conname=testName(con.getName());StringBuilder canshu=new StringBuilder();Class conptype[]=con.getParameterTypes();if(conptype.length!=0){for(Class typeclass:conptype){String typename=testName(typeclass.getName());canshu.append(typename+" name,");}canshu.deleteCharAt(canshu.length()-1);}String coninfo=conxiu+" "+conname+"("+canshu.toString()+"){}";System.out.println("\t"+coninfo);}//得到實例方法Method methodarr[]=stuclass2.getDeclaredMethods();for(Method meth:methodarr){String mothxiu=Modifier.toString(meth.getModifiers());String tereturn=testName(meth.getReturnType().getName());String methname=meth.getName();StringBuilder canshu=new StringBuilder();Class mathodptype[]=meth.getParameterTypes();if(mathodptype.length!=0){for(Class typeclass:mathodptype){String typename=testName(typeclass.getName());canshu.append(typename+" args,");}canshu.deleteCharAt(canshu.length()-1);}String methodinfo=mothxiu+" "+tereturn+" "+methname+"("+canshu.toString()+") {}";System.out.println("\t"+methodinfo);}System.out.println("}");} }?
總結
- 上一篇: android 配色方案,最实用的APP
- 下一篇: 微信公众号运营错误的四个方式