文章目录
- [476. Java 反射 - 调用方法](#476. Java 反射 - 调用方法)
476. Java 反射 - 调用方法
在反射中,Method 类代表一个方法。
通过 Method 对象,我们可以:
- 获取方法的返回类型、修饰符、参数类型和名称
- 调用方法,传递必要的参数,并得到返回值
这一节,我们重点学习如何 定位方法 和 调用方法。
1. 定位方法的方式
Class 提供了四组方法,用于查找特定方法或方法集合:
| API 方法 | 返回多个方法? | 包含继承的方法? | 包含私有方法? |
|---|---|---|---|
getDeclaredMethod(String, Class<?>...) |
否 | 否 | ✅ 是 |
getMethod(String, Class<?>...) |
否 | ✅ 是 | ❌ 否 |
getDeclaredMethods() |
✅ 是 | 否 | ✅ 是 |
getMethods() |
✅ 是 | ✅ 是 | ❌ 否 |
👉 口诀:
- Declared → 只看当前类,包含私有方法。
- 不带 Declared → 包含父类方法,但只返回
public。
2. 示例类:User
java
public class User {
private final String name;
public User(String name) {
validate(name);
this.name = name;
}
private void validate(String name) {
Objects.requireNonNull(name);
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User[name=" + name + "]";
}
}
3. 获取所有 public 方法
java
Class<?> c = User.class;
Method[] methods = c.getMethods();
for (Method method : methods) {
System.out.println("method = " + method);
}
输出结果:
java
method = public java.lang.String org.devjava.User.getName()
method = public java.lang.String org.devjava.User.toString()
method = public boolean java.lang.Object.equals(java.lang.Object)
method = public native int java.lang.Object.hashCode()
method = public final native java.lang.Class java.lang.Object.getClass()
method = public final native void java.lang.Object.notify()
method = public final native void java.lang.Object.notifyAll()
method = public final void java.lang.Object.wait(long) throws java.lang.InterruptedException
method = public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
method = public final void java.lang.Object.wait() throws java.lang.InterruptedException
📌 说明:
- 结果包含了
User自己的公共方法 :getName()和toString() - 还包含了从
Object继承的公共方法,如equals()、hashCode()、wait()等
4. 获取当前类的所有方法(含私有)
java
Class<?> c = User.class;
Method[] methods = c.getDeclaredMethods();
for (Method method : methods) {
System.out.println("method = " + method);
}
输出结果:
java
method = public java.lang.String org.devjava.User.getName()
method = public java.lang.String org.devjava.User.toString()
method = private void org.devjava.User.validate(java.lang.String)
📌 说明:
- 这次结果只包含
User类本身定义的方法 - 包括了私有的
validate(String)方法
5. 总结
getMethods()→ 包含继承的public方法getDeclaredMethods()→ 只看当前类,包含私有方法getMethod(name, params)/getDeclaredMethod(name, params)→ 精确查找单个方法- 下一步:学会如何通过
Method.invoke()真正调用方法 🚀