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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

利用java反射调用类的的私有方法--转

發布時間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用java反射调用类的的私有方法--转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文:http://blog.csdn.net/woshinia/article/details/11766567

1,今天和一位朋友談到父類私有方法的調用問題,本來以為利用反射很輕松就可以實現,因為在反射看來根本不區分是否是private的,沒有想到調用本身的私有方法是可以的,但是調用父類的私有方法則不行,后來糾其原因很有可能是因為getDeclaredMethod方法和getMethod方法并不會查找父類的私有方法,于是只好自己寫遞歸了,經過嘗試果然如此。把代碼放出來方便更多人。這段代碼可以解決很多實際問題,不過利用反射來做的話性能不會太好。

[java]?view plaincopy
  • package?com.syj.util.reflect;??
  • ??
  • import?java.lang.reflect.Method;??
  • ??
  • /**?
  • ?*?<p>?
  • ?*?Title:?私有方法調用工具類?
  • ?*?</p>?
  • ?*??
  • ?*?<p>?
  • ?*?Description:利用java反射調用類的的私有方法?
  • ?*?</p>?
  • ?*??
  • ?*?<p>?
  • ?*?Copyright:?Copyright?(c)?2007?
  • ?*?</p>?
  • ?*??
  • ?*?@author?孫鈺佳?
  • ?*?@main?sunyujia@yahoo.cn?
  • ?*?@date?Jun?1,?2008?10:18:58?PM?
  • ?*/??
  • public?class?PrivateUtil?{??
  • ????/**?
  • ?????*?利用遞歸找一個類的指定方法,如果找不到,去父親里面找直到最上層Object對象為止。?
  • ?????*??
  • ?????*?@param?clazz?
  • ?????*????????????目標類?
  • ?????*?@param?methodName?
  • ?????*????????????方法名?
  • ?????*?@param?classes?
  • ?????*????????????方法參數類型數組?
  • ?????*?@return?方法對象?
  • ?????*?@throws?Exception?
  • ?????*/??
  • ????public?static?Method?getMethod(Class?clazz,?String?methodName,??
  • ????????????final?Class[]?classes)?throws?Exception?{??
  • ????????Method?method?=?null;??
  • ????????try?{??
  • ????????????method?=?clazz.getDeclaredMethod(methodName,?classes);??
  • ????????}?catch?(NoSuchMethodException?e)?{??
  • ????????????try?{??
  • ????????????????method?=?clazz.getMethod(methodName,?classes);??
  • ????????????}?catch?(NoSuchMethodException?ex)?{??
  • ????????????????if?(clazz.getSuperclass()?==?null)?{??
  • ????????????????????return?method;??
  • ????????????????}?else?{??
  • ????????????????????method?=?getMethod(clazz.getSuperclass(),?methodName,??
  • ????????????????????????????classes);??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????????return?method;??
  • ????}??
  • ??
  • ????/**?
  • ?????*??
  • ?????*?@param?obj?
  • ?????*????????????調整方法的對象?
  • ?????*?@param?methodName?
  • ?????*????????????方法名?
  • ?????*?@param?classes?
  • ?????*????????????參數類型數組?
  • ?????*?@param?objects?
  • ?????*????????????參數數組?
  • ?????*?@return?方法的返回值?
  • ?????*/??
  • ????public?static?Object?invoke(final?Object?obj,?final?String?methodName,??
  • ????????????final?Class[]?classes,?final?Object[]?objects)?{??
  • ????????try?{??
  • ????????????Method?method?=?getMethod(obj.getClass(),?methodName,?classes);??
  • ????????????method.setAccessible(true);//?調用private方法的關鍵一句話??
  • ????????????return?method.invoke(obj,?objects);??
  • ????????}?catch?(Exception?e)?{??
  • ????????????throw?new?RuntimeException(e);??
  • ????????}??
  • ????}??
  • ??
  • ????public?static?Object?invoke(final?Object?obj,?final?String?methodName,??
  • ????????????final?Class[]?classes)?{??
  • ????????return?invoke(obj,?methodName,?classes,?new?Object[]?{});??
  • ????}??
  • ??
  • ????public?static?Object?invoke(final?Object?obj,?final?String?methodName)?{??
  • ????????return?invoke(obj,?methodName,?new?Class[]?{},?new?Object[]?{});??
  • ????}??
  • ??
  • ????/**?
  • ?????*?測試反射調用?
  • ?????*??
  • ?????*?@param?args?
  • ?????*/??
  • ????public?static?void?main(String[]?args)?{??
  • ????????PrivateUtil.invoke(new?B(),?"printlnA",?new?Class[]?{?String.class?},??
  • ????????????????new?Object[]?{?"test"?});??
  • ????????PrivateUtil.invoke(new?B(),?"printlnB");??
  • ????}??
  • }??
  • ??
  • class?A?{??
  • ????private?void?printlnA(String?s)?{??
  • ????????System.out.println(s);??
  • ????}??
  • }??
  • ??
  • class?B?extends?A?{??
  • ????private?void?printlnB()?{??
  • ????????System.out.println("b");??
  • ????}??
  • }??
  • ?


    程序的輸出結果為
    test
    b
    說明private方法調用成功了不管是自己的私有方法還是父類的私有方法。\

    2,

    ?

    [java]?view plaincopy
  • package?me.test;??
  • import?java.lang.reflect.*;??//導入反射需要的包??
  • public?class?ReflectTest?{??
  • ?public?static?void?main(String[]?args)??throws??Exception??
  • ?{????
  • ????
  • ??/*??下面通過反射完成對一個對象中成員的替換?
  • ???*???并且執行執行私有方法???
  • ???*???完成對?Poiont類的對象中所有的?String的對象的d換成x?
  • ???*???并且類中無修改方法?????
  • ???*/???
  • ????Point?pt=new?Point(3,5);??//創建一個Point對象??
  • ????Field?fx=pt.getClass().getField("x")?;??//獲取x的映射類對象??
  • ????Field?fy=pt.getClass().getDeclaredField("y");//因為y是私有的所以要調用這個方法???
  • ????Method?m2=Point.class.getDeclaredMethod("showPrivate")?;//獲得私有方法映射類????
  • ??????
  • ????//利用反射調用共有輸出???
  • ????m2.setAccessible(true)??;//?修改showPrivate?權限?改變為可以調用??
  • ???????m2.invoke(pt)?;//執行私有方法??
  • ????//利用成員反射輸出x?和?私有的?y????
  • ????System.out.println(fx.getInt(pt));//反射輸出x????
  • ????fy.setAccessible(true)?;//改變私有為可訪問??
  • ????System.out.println(fy.getInt(pt));//輸出私有y??
  • ??????????
  • ????//替換成員后并且反射私有方法輸出???
  • ????changeString(pt)?;//反射替換成員值??
  • ?????System.out.println(pt);??
  • ??????
  • ??????
  • ?}??
  • ?public?static?void?changeString(Object?obj)??throws?Exception//反射替換對所有String進行替換??
  • ?{???
  • ??Field[]?f=obj.getClass().getFields()??;?//獲得成員映射數組??
  • ??for(Field?tem?:?f)??//迭代for循環??
  • ??{??
  • ???if(tem.getType()==String.class)??//內存中只有一份String字節碼???
  • ???{??
  • ????String?oldString=(String)tem.get(obj)?;??//返回內容??
  • ????String?newString=oldString.replace('d',?'x');//將所有b替換為x????
  • ????tem.setAccessible(true);??
  • ?????tem.set(obj,?newString)?;//替換成員值??
  • ???}??
  • ?????
  • ??}??
  • ????
  • ?}??
  • }??
  • ??
  • public?class?Point??
  • {??
  • ?public?int?x??;??
  • ?private?int?y??;??
  • ?public?Point(int?x,?int?y)?{??
  • ??super();??
  • ??this.x?=?x;??
  • ??this.y?=?y;??
  • ?}??
  • ???public?String??a="dsfdsfd"??;??//只有?共有可以替換??
  • ???public?String??b="fdsfdsfewewwwww"??;??
  • ???public?String??c="adddssss"??;??
  • ??
  • ?private?void?showPrivate()??//私有方法輸出??
  • ?{??
  • ??System.out.println("x="+this.x+"\n"+"y="+this.y);??
  • ??System.out.println(this.a);??
  • ??System.out.println(this.b);??
  • ??System.out.println(this.c);???
  • ?}??
  • ??
  • ?public?String?toString()??
  • ?{??
  • ??return?this.a+"\n"+this.b+"\n"+this.c;??
  • ?}??
  • ??
  • }??

  • 3,??

    Java利用反射來獲取一個方法的 范型化參數 Vector<Integer>的類型

    [java]?view plaincopy
  • class???A??
  • ??
  • {??
  • ??
  • ?????public??void???show(Vector<Integer>?v)??{}??
  • }????
  • ??
  • 在我們不知道Vector中數據的類型的時候?這時候我們只知道這個方法的名字??和參數的個數?,我們來獲取?范型化的實際類型?。???
  • ??
  • 我們不可能通過?Vector對應的Class類來反射出??泛型集合中的類型??,但是?我們卻可以通過?這個方法所對應的Method類來實現?。??
  • ??
  • 具體如下??:??
  • ??
  • import?java.lang.reflect.Method;??
  • import?java.lang.reflect.ParameterizedType;??
  • import?java.lang.reflect.Type;??
  • import?java.util.Vector;??
  • ??
  • public?class?Test3??
  • {??
  • ?public?static?void?main(String?[]args)?throws?SecurityException,?NoSuchMethodException??
  • ?{??
  • ??Method??m=A.class.getMethod("show",?Vector.class)?;??????//反射獲得show方法的Method對象??
  • ??Type[]t=m.getGenericParameterTypes()?;??????//獲得范型參數的?一個Type數組??Type是Class類的基類?GenericArrayType,?ParameterizedType,?TypeVariable<D>,?WildcardType??這些都是?實現Type的子接口???
  • ??ParameterizedType?p=(ParameterizedType)t[0];?????//強制轉換成Type的子接口?ParameterizedType類型?因為這個接口又可以獲得?范型化集合中元素的類型????System.out.println(p.getRawType());?????????????????????//獲得集合的類型????
  • ??System.out.println(p.getActualTypeArguments()[0]);???//獲得集合中元素的類型??
  • ?}??
  • ??
  • }??
  • 轉載于:https://www.cnblogs.com/mochaMM/p/5016431.html

    總結

    以上是生活随笔為你收集整理的利用java反射调用类的的私有方法--转的全部內容,希望文章能夠幫你解決所遇到的問題。

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