日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

认识反射

發布時間:2023/12/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 认识反射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

認識反射

13.1.反射是什么,有什么作用?

? ? ?反射---在程序運行的過程中,我們可以得到某個類的對象,可以調用某個類中的任何一個變量/方法,這種動態獲取信息的過程就是反射。當我們在沒有見過某個類的情況下,僅憑一個完整的

類名,就可以獲取到整個類的所有信息。

? ? ?反射的使用場景:

  • jdbc加載數據庫驅動
  • Servlet的web.xml配置
  • Spring框架
  • 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("}");} }

    ?

    總結

    以上是生活随笔為你收集整理的认识反射的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。