首页 > 投稿 > 正文内容

3分钟掌握Java反射获取类方法的3种核心操作

投稿2025-05-19 16:48:09

哎,你刚学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早优化得亲妈都不认识了。倒是那些个乱用反射把代码写成盘丝洞的,建议直接送去西天取经——毕竟只有如来佛祖能镇住这种妖孽代码!

搜索