Java的反射機(jī)制, 將Android系統(tǒng)的安全性幾乎破壞得一無是處了。。。。。 這篇文章基本上該說的都說了~~, 回家慢慢學(xué)習(xí)Android的源碼吧,統(tǒng)統(tǒng)破了~~今天和一位朋友談到父類私有方法的調(diào)用問題,本來以為利用反射很輕松就可以實(shí)現(xiàn),因?yàn)樵诜瓷淇磥砀静粎^(qū)分是否是private的,沒有想到調(diào)用本身的私有方法是可以的,但是調(diào)用父類的私有方法則不行,后來糾其原因很有可能是因?yàn)間etDeclaredMethod方法和getMethod方法并不會(huì)查找父類的私有方法,于是只好自己寫遞歸了,經(jīng)過嘗試果然如此。把代碼放出來方便更多人。這段代碼可以解決很多實(shí)際問題,不過利用反射來做的話性能不會(huì)太好
- public class PrivateUtil {
-
- 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;
- }
-
- 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);
- 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[] {});
- }
-
- 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");
- }
- }
- 程序的輸出結(jié)果為
- test
- b
- 說明private方法調(diào)用成功了不管是自己的私有方法還是父類的私有方法。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。