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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

RefFieldMethodDetails——查看类的域和方法

發布時間:2024/7/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RefFieldMethodDetails——查看类的域和方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

RefFieldMethodDetails,通過反射機制查看類的域和方法(包括編譯器添加的“橋方法”)

public class RefFieldMethodDetails {/*** 打印出指定類的* 1、聲明的所有構造方法(包括私有)* 2、聲明的所有方法(包括私有)* 3、聲明的所有域(包括私有)*/public static <T> void details(Class<T> clazz){details(clazz.getName());}/*** 打印出指定類的* 1、所有公共構造方法(包括超類)* 2、所有公共方法(包括超類)* 3、所有公共域(包括超類)*/public static <T> void details2(Class<T> clazz){details2(clazz.getName());}/*** 打印出指定類的* 1、聲明的所有構造方法(包括私有)* 2、聲明的所有方法(包括私有)* 3、聲明的所有域(包括私有)*/public static void details(String name){try {Class cl = Class.forName(name);Class supercl = cl.getSuperclass();String modifiers = Modifier.toString(cl.getModifiers());if(modifiers.length()>0){System.out.print(modifiers + " ");}System.out.print("class " + name);if(supercl !=null && supercl!=Object.class){System.out.print(" extends " + supercl.getName());}System.out.print("\n{\n");printConstructors(cl);System.out.println();printMethods(cl);System.out.println();printFields(cl);System.out.println("}");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 打印出指定類的* 1、所有公共構造方法(包括超類)* 2、所有公共方法(包括超類)* 3、所有公共域(包括超類)*/public static void details2(String name){try {Class cl = Class.forName(name);Class supercl = cl.getSuperclass();String modifiers = Modifier.toString(cl.getModifiers());if(modifiers.length()>0){System.out.print(modifiers + " ");}System.out.print("class " + name);if(supercl !=null && supercl!=Object.class){System.out.print(" extends " + supercl.getName());}System.out.print("\n{\n");printConstructors2(cl);System.out.println();printMethods2(cl);System.out.println();printFields2(cl);System.out.println("}");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//返回本類聲明的所有域(包括私有)private static void printFields(Class cl) {Field[] fields = cl.getDeclaredFields();for(Field field : fields){String modifier = Modifier.toString(field.getModifiers());Class type = field.getType();String name = field.getName();System.out.print(" ");System.out.print(modifier +" ");System.out.print(type + " ");System.out.println(name + ";");}}//返回本類的所有公共域(包括超類)private static void printFields2(Class cl) {Field[] fields = cl.getFields();for(Field field : fields){String modifier = Modifier.toString(field.getModifiers());Class type = field.getType();String name = field.getName();System.out.print(" ");System.out.print(modifier +" ");System.out.print(type + " ");System.out.println(name + ";");}}//返回本類聲明的所有方法(包括私有)private static void printMethods(Class cl) {Method[] methods = cl.getDeclaredMethods();for(Method method : methods){String modifier = Modifier.toString(method.getModifiers());Class returnType = method.getReturnType();String name = method.getName();Class[] params = method.getParameterTypes();System.out.print(" ");if(modifier.length()>0){System.out.print(modifier + " ");}System.out.print(returnType.getSimpleName() +" ");System.out.print(name+"( ");for(int i=0;i<params.length;i++){System.out.print(params[i].getName());if(i!=params.length-1){System.out.print(", ");}}System.out.println(" );");}}//返回本類的所有公共方法(包括超類)private static void printMethods2(Class cl) {Method[] methods = cl.getMethods();for(Method method : methods){String modifier = Modifier.toString(method.getModifiers());Class returnType = method.getReturnType();String name = method.getName();Class[] params = method.getParameterTypes();System.out.print(" ");if(modifier.length()>0){System.out.print(modifier + " ");}System.out.print(returnType.getSimpleName() +" ");System.out.print(name+"( ");for(int i=0;i<params.length;i++){System.out.print(params[i].getName());if(i!=params.length-1){System.out.print(", ");}}System.out.println(" );");}}//返回本類聲明的所有構造方法(包括私有)private static void printConstructors(Class cl) {Constructor[] cs = cl.getDeclaredConstructors();for(Constructor c : cs){String modifier = Modifier.toString(c.getModifiers());String name = c.getName();Class[] params = c.getParameterTypes();System.out.print(" ");if(modifier.length()>0){System.out.print(modifier + " ");}System.out.print(name);System.out.print("( ");for(int i=0 ;i<params.length ;i++){System.out.print(params[i].getName());if(i!=params.length-1){System.out.print(", ");}}System.out.println(" );");}}//返回本類的所有公共構造方法(包括超類)private static void printConstructors2(Class cl) {Constructor[] cs = cl.getConstructors();for(Constructor c : cs){String modifier = Modifier.toString(c.getModifiers());String name = c.getName();Class[] params = c.getParameterTypes();System.out.print(" ");if(modifier.length()>0){System.out.print(modifier + " ");}System.out.print(name);System.out.print("( ");for(int i=0 ;i<params.length ;i++){System.out.print(params[i].getName());if(i!=params.length-1){System.out.print(", ");}}System.out.println(" );");}} }

對程序員來說,方法的簽名只包括:

1、方法的名稱;2、參數的類型;3、參數的順序;

但是對JVM而言,方法的簽名還包括:4、返回的類型!


演示“完全” Override,即上述4 條件都滿足:

class SuperClass{private final String name;public SuperClass(String name) {super();this.name = name;}public String getName() {return "SuperClass";}}public class OverrideTest extends SuperClass{private final Date date;public OverrideTest(String name, Date date) {super(name);this.date = date;}public Date getDate() {return date;}//覆蓋父類的方法,重點是這個@Overridepublic String getName() {return "OverrideTest";} }通過 RefFieldMethodDetails,來查看OverrideTest 類的域和方法:

@Testpublic void testGetName() {RefFieldMethodDetails.details(OverrideTest.class);RefFieldMethodDetails.details2(OverrideTest.class);}
這和我們理解的“覆蓋”相吻合!即,始終只有一個方法簽名的方法。

下面來看看,“不完全”覆蓋,即參數類型是繼承關系(泛型的特殊處理,一般情況是重載)返回類型不同時的情況:

class Pair<T> {private T first;private T second;public Pair() {first = null;second = null;}public Pair(T first, T second) {this.first = first;this.second = second;}public T getFirst() {return first;}public T getSecond() {return second;}public void setFirst(T newValue) {first = newValue;}public void setSecond(T newValue) {second = newValue;} }public class DateInterval extends Pair<Date>{//參數類型——有繼承關系@Overridepublic void setSecond( Date second ){if( second.compareTo( getFirst()) >= 0 ){super.setSecond( second );}}//返回類型不同@Overridepublic Date getSecond(){return (Date)super.getSecond();} }

通過 RefFieldMethodDetails,來查看 DateInterval 類的域和方法:

@Testpublic void testOverride() {//打印DateInterval 的所有域和方法(包括private 不包括父類的)RefFieldMethodDetails.details( DateInterval.class );//打印DateInterval 的所有公共域和方法(包括父類的)RefFieldMethodDetails.details2( DateInterval.class );}

“橋方法”的任務就是調用子類相應的“不完全”覆蓋的方法。

常用的“橋方法”實現有,clone 方法

總結

以上是生活随笔為你收集整理的RefFieldMethodDetails——查看类的域和方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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