Java通过反射调用一个类的私有方法 小鱼儿 2022-05-20 05:44 480阅读 0赞 ## 本文转载自:https://www.cnblogs.com/ghq120/p/8439204.html ## 获得私有方法的流程是 (1)获取目标类 (2)获取目标方法 Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法) Method method=clazz.getMethod(name);//可以调用类中有访问权限的方法(包括父类中继承的方法) (3)method.toGenericString()或method.toString()方法来输出方法的字符串形式 `toGenericString()` 返回描述此 `Method` 的字符串,包括类型参数。 `toString()` 返回描述此 `Method` 的字符串。 目前没有弄清这两种方法的具体区别,测试的方法中输出的结果一样,以后弄清区别再来更改。 (4)使用invoke()方法调用方法 package test0210; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class test1 { //类的私有方法 private String testMethod(int num){ return "输入的数字为:"+num; } public static void main(String[] args) { try { Class clazz = Class.forName("test0210.test1"); Method method = clazz.getDeclaredMethod("testMethod", int.class); //打印完整地方法表示字符串 System.out.println(method.toGenericString()); //调用方法 Object obj = method.invoke(clazz.newInstance(), 2); System.out.println(obj); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } ![format_png][] 上面的代码将测试和私有方法放在了一起,没有出现异常。 下面的代码将测试和方法分开在两个类中,运行后会出现 java.lang.IllegalAccessException异常 package test0210; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class test2 { public static void main(String[] args) { try { Class<?> clazz = Class.forName("test0210.test1"); Method method = clazz.getDeclaredMethod("testMethod", int.class); System.out.println(method.toGenericString()); Object obj = method.invoke(clazz.newInstance(), 2); System.out.println(obj); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } ![format_png 1][] 查询资料说明该异常是在反射中调用了private修饰的方法。咦,反射不是可以得到私有的方法,为什么这里不能,没办法继续上网查资料。。。 最后搞明白了是缺少setAccessible(true)方法,使用继承父类(AccessibleObject类)来的setAccessible()方法,来设置或取消访问检查,以达到访问私有对象的目的。 Class<?> clazz = Class.forName("test0210.test1"); Method method = clazz.getDeclaredMethod("testMethod", int.class); method.setAccessible(true); System.out.println(method.toGenericString()); ### Java反射机制调用私有方法,是不是破坏了Java的封装性? ### 答案是否定的。要探讨这个问题,就必须要知道什么是封装性,什么是安全? 封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。 安全,如果意思是保护实现源码不被别人看见,那没有作用。不用反射也能轻易获取源码。 我以为反射机制只是提供了一种强大的功能,使得开发者能在封装之外,按照特定的需要实现一些功能。 Java语言是一个严谨的编程语言,语言本身是静态的。为了能让语言具有动态编程的特性,必须要有反射机制。而反射机制本身就是底层的处理,不可能按表层的封转特性来处理。也就是说不给调用私有方法的能力,很多程序受到局限,那么实现起来就麻烦了。 举一个生活的例子,你家的电视机是要由外壳的,目的是不让普通人接触到电视中的电路。那么Java语言的基本面向对象特征正是这个层次的应用。也就是对于普通程序员的程序,是通过遥控器来操作电视的。但是,如果你是一个专业的电工的话,那么可以打开电视机的后盖,调整电视中的电路和结构,甚至如果是电工的话,那么调台可能都不使用遥控器,而是通过调整内部电路的电阻的阻值来实现。Java中的反射机制正是提供更高要求的编程来使用的,不需要考虑基本面向对象的特征,而是要考虑能否得到和控制代码中的一切,这样反射机制编程才有意义。 [format_png]: /images/20220520/8a71707a42554a6e8f3c8bef45e9c28d.png [format_png 1]: /images/20220520/22cb6862c5354548ba5a790d53713745.png
相关 Java反射调用私有方法的权限问题 在Java中,如果你试图通过反射调用一个私有方法(即方法前带有“private”修饰符),那么会抛出`java.lang.reflect.AccessControlExcept 超、凢脫俗/ 2024年09月16日 06:04/ 0 赞/ 10 阅读
相关 Java中的反射:调用私有方法案例 在Java中,私有方法(private method)是属于类的内部,不能直接通过对象访问。然而,由于Java提供了反射API(Reflection API),我们可以在运行时 逃离我推掉我的手/ 2024年09月12日 14:12/ 0 赞/ 11 阅读
相关 C#通过反射获得一个类的私有字段 C\通过反射获得一个类的私有字段 背景 代码实现 运行结果 关键代码 背景 在有的业务需求中我们需要把一个类的私有字段遍历出来,这时首先考 た 入场券/ 2022年12月05日 00:43/ 0 赞/ 171 阅读
相关 java通过反射执行方法,Java通过反射调用方法 Java通过反射调用方法 package com.wkcto.chapter08.demo02; import java.lang.reflect.Constructor; Myth丶恋晨/ 2022年11月18日 04:59/ 0 赞/ 253 阅读
相关 java反射方式调用私有方法 以下内容转自:[http://blog.csdn.net/sunyujia/article/details/2501709][http_blog.csdn.net_sunyuj 比眉伴天荒/ 2022年09月30日 14:59/ 0 赞/ 211 阅读
相关 通过反射调用类中的方法 import java.lang.Class; import java.lang.reflect.Method; public class Test 布满荆棘的人生/ 2022年08月26日 13:17/ 0 赞/ 225 阅读
相关 通过Java反射调用方法 转自:[http://blog.csdn.net/ichsonx/article/details/9108173][http_blog.csdn.net_ichsonx_art 喜欢ヅ旅行/ 2022年07月13日 02:07/ 0 赞/ 260 阅读
相关 Java通过反射调用一个类的私有方法 本文转载自:https://www.cnblogs.com/ghq120/p/8439204.html 获得私有方法的流程是 (1)获取目标类 (2)获取目标方法 小鱼儿/ 2022年05月20日 05:44/ 0 赞/ 481 阅读
相关 反射_通过反射调用类中指定方法、属性 一、调用指定方法 通过反射,调用类中的方法,通过Method类完成。步骤: 1、通过Class类的getMethod(String name,Class.......p £神魔★判官ぃ/ 2022年05月20日 00:34/ 0 赞/ 285 阅读
还没有评论,来说两句吧...