Java反射-调用方法

调用方法与访问字段类似,

  • 通过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的修饰的方法,通过设置访问权限之后来调用,Method.setAccessible(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);
        //System.out.println(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");
    }
}

你可能感兴趣的:(JAVA学习之旅,java,开发语言,代理模式)