
嘻道奇闻
- 文章199742
- 阅读14625734
3分钟掌握Java反射获取类方法的3种核心操作
哎,你刚学Java的时候是不是也这样?明明照着教程写代码,一看到"反射"两个字就头晕——什么类加载器、Method对象、invoke方法…这些词儿听着比高数还抽象对吧?就跟新手如何快速涨粉一样,总感觉别人都懂就自己卡在第一步。别慌,今天咱们就用煮泡面的难度,拆解反射获取类方法的三大绝招!
(停顿两秒)等等,先别急着关页面!我知道你在想什么:"反射这玩意儿日常开发根本用不上啊?"那你可错了。Spring框架的依赖注入、单元测试的Mock数据、甚至你每天用的IDE自动补全功能…全都是反射在背后撑腰!现在是不是觉得手里啃一半的薯片都不香了?
第一招:暴力破解式获取法
掏出你的键盘,先写个最简单的类当靶子:
java复制public class Cat { public void eat() { System.out.println("吃鱼"); } private void sleep() { System.out.println("睡沙发"); } }
??关键代码:??
Class<? > clazz = Class.forName("com.example.Cat");
Method[] methods = clazz.getMethods();
这时候你会得到一个包含eat()和Object类所有公共方法的数组。对,就像拿着金属探测器在海滩扫荡,连埋在沙里的易拉罐环都不会放过!
第二招:精准狙击式获取
想要只拿到自家类的方法?试试这个:
java复制Method[] declaredMethods = clazz.getDeclaredMethods();
运行结果:[eat(), sleep()]
??注意!?? 这个方法会把私有方法也给你刨出来,就像翻自家抽屉找私房钱一样彻底。但你要是直接调用私有方法…(系统提示音:您的好友IllegalAccessException已上线)
第三招:指哪打哪的GPS定位
知道方法名和参数类型就能精确打击:
java复制Method eatMethod = clazz.getMethod("eat"); Method sleepMethod = clazz.getDeclaredMethod("sleep");
这时候可能有同学要拍桌子了:"老师你骗人!我照着写为什么报NoSuchMethodException?"
(翻出小本本)来,咱们现场抓个典型——当你获取私有方法时,必须用getDeclaredMethod而不是getMethod!就像不能用公交卡刷开银行金库一个道理。
灵魂拷问时间
??Q:为什么我获取的方法列表里有好多没写过的方法???
A:因为你用了getMethods()啊兄弟!这个方法会把父类Object里的wait()、notify()这些"祖传方法"都打包送给你,跟过年收压岁钱时连装钱的旧信封都拿走一个性质。
??Q:获取到私有方法后到底能不能用???
这时候要祭出大杀器了:
sleepMethod.setAccessible(true);
这行代码就像万能钥匙,能把private修饰符变成透明人。不过公司项目里乱改访问权限的话…(项目经理提刀赶来的音效)
方法对比表
方法名 | 获取范围 | 包含私有 | 性能消耗 |
---|---|---|---|
getMethods() | 所有公共方法 | × | 较高 |
getDeclaredMethods() | 当前类所有方法 | √ | 中等 |
getMethod() | 指定公共方法 | × | 较低 |
(突然拍大腿)对了!上周有个学员踩的坑你们必须知道——获取带参数的方法时,光写参数类型还不够,得用.class后缀:
java复制// 错误示范:getMethod("setAge", int); // 正确姿势:getMethod("setAge", int.class);
这种错误就像把"微信付款"说成"微付信款",编译器直接给你表演黑人问号脸。
小编观点
反射这玩意就像瑞士军刀,用好了能切牛排开红酒,用不好分分钟割手见血。别听那些"反射影响性能"的鬼话,JVM早优化得亲妈都不认识了。倒是那些个乱用反射把代码写成盘丝洞的,建议直接送去西天取经——毕竟只有如来佛祖能镇住这种妖孽代码!