调用方法与访问字段类似,
- 通过
Class实例
的方法获得Method实例
getMethod()、getDeclaredMethod()、getMethods()、getDeclaredMethods()(这里的方法与获得Field字段的时候的用法是一致的) - 通过
Method实例
可以获得有关方法的信息 getName()、getReturnTypes()、getParameterTypes()、getModifiers() (方法的名字、返回类型、参数类型、修饰符) - 通过
Method实例
调用某个对象的方法invoke()
函数
1、通过Method实例
调用某个对象的方法
invoke()方法的例子
package reflect;
import java.lang.reflect.Method;
/**
* @className:GetMethod;
* @time:2022-05-17-21:04;
* @author:Lee Ye;
* @description:这是一个java示例;
*/
public class GetMethod {
public static void main(String[] args) throws Exception{
String s1 = "Hello Java";
String t1 = s1.substring(6);
System.out.println(t1);
System.out.println("-------------测试通过反射调用方法-----------");
String s2 = "Hello world";
//getMethod 需要传入两个参数,一个是方法名,另一个是该方法名需要的参数类型,
//getMethod 的返回值是Method对象
//substring 有两个重载方法, substring(int begin)、substring(int begin, int end)
Method m1 = s2.getClass().getMethod("substring", int.class);
Method m2 = String.class.getMethod("substring", int.class, int.class);
// invoke 是Method对象中的一个调用方法的方法,返回值是 Object 类型,下面做了强制转换
// invoke 第一个参数是 对象实例, 后面跟着的是可变参数,参数类型要与上面getMethod方法对应
String t2 = (String)m1.invoke(s2, 6);
String t3 = (String)m2.invoke(s2, 3, 6);
System.out.println(t2);
System.out.println(t3);
}
}
2、调用静态方法
主要特殊的地方在无需指定实例对象
,在invoke的第一个参数为null值
//Main方法里面的内容
System.out.println("----------测试通过反射调用静态方法----------");
Method m3 = Integer.class.getMethod("parseInt", String.class);
Integer t4 = (int)m3.invoke(null, "1234");
System.out.println(t4);
System.out.println(t4.getClass().toString());
3、调用非public方法
涉及到非public的修饰的方法,通过设置访问权限之后来调用,(true);
//Main方法里面的内容
System.out.println("------------测试访问非public方法-----------");
Per p = new Per();
//注意无参数的参数为null
Method m4 = p.getClass().getDeclaredMethod("Print",null);
m4.setAccessible(true);
Object obj = m4.invoke(new Per(), null);
//(obj);
class Per{
private void Print(){
System.out.println("成功调用非public方法");
}
}
4、多态
遵循着 编译看左边,运行看右边
的原则,虽然获取的是 Per 中的方法,但是实际执行看的还是 Stu 中的方法
//Main里面的内容
System.out.println("------------测试多态-----------");
Method m5 = p.getClass().getDeclaredMethod("Echo");
Object obj2 = m5.invoke(new Stu(), null);
class Per{
private void Print(){
System.out.println("成功调用非public方法");
}
public void Echo(){
System.out.println("Per:Hello");
}
}
class Stu extends Per{
@Override
public void Echo(){
System.out.println("Stu:Hello");
}
}