Java 反射学习《三》Method详解

Java 反射学习《一》 Field详解

Java 反射学习《二》 Constructor详解

Java 反射学习《三》Method详解

根据Class获取类的Method

public class Demo {
    public void demoMethod1() {
    }

    public void demoMethod2() {
    }
    
    public static void demoMethod3() {
    }
}

public interface DemoInterface {
    public static void interfaceMethod1() {
    }

    public default void interfaceMethod2() {
    }

    public default void interfaceMethod3() {
    }
}

public class Person extends Demo implements DemoInterface {
    public void method1(String param1) {
        System.out.println("这是Method1 " + param1);
    }

    public boolean method1(int param1) {
        System.out.println("这是Method1");
        return true;
    }

    void method2(String param1, String param2) {
        System.out.println("这是Method2");
    }

    protected void method3(String param1, String param2, String param3) {
        System.out.println("这是Method3 " + param1 + " "+ param2 + " " + param3 );
    }

    private void method4(String param1, String param2, String param3) {
        System.out.println("这是Method4");
    }

    public static void method5(String param1) {
        System.out.println("这是Method5");
    }

    public void method5(int param1) {
        System.out.println("这是Method5");
    }

    @Override
    public void demoMethod1() {
        super.demoMethod1();
    }

    @Override
    public void interfaceMethod2() {
    }
}

  • public Method[] getDeclaredMethods() throws SecurityException 返回使用public,protected,default,private,但不包括无论从类还是接口继承的方法,但是从父类或者接口重写的方法会包含在内。也是在类中实现函数的函数都能得到

    Class cls = Person.class;
    Method[] methods = cls.getDeclaredMethods();
    for (Method method : methods) {
        System.out.println("修饰符:" + Modifier.toString(method.getModifiers()) +
                " 名称:" + method.getName() +
                "参数个数:" + method.getParameterCount());
    }
    //输出
    //修饰符:public 名称:method1参数个数:1
    //修饰符:public 名称:method1参数个数:1
    //修饰符: 名称:method2参数个数:2
    //修饰符:protected 名称:method3参数个数:3
    //修饰符:private 名称:method4参数个数:3
    //修饰符:public static 名称:method5参数个数:1
    //修饰符:public 名称:method5参数个数:1
    //修饰符:public 名称:demoMethod1参数个数:0
    //修饰符:public 名称:interfaceMethod2参数个数:0
    
  • **public Method getDeclaredMethod(String name, Class<?>… parameterTypes) throws NoSuchMethodException, SecurityException ** 根据函数名和参数类型,获取Method(能获取到的Method和上面一样)

    Class cls = Person.class;
    Person person = new Person();
    try{
       Method method = cls.getDeclaredMethod("method3",String.class,String.class,String.class);
       method.invoke(person,"参数1","参数2","参数3");
    }catch (Exception e){
    }
    //这是Method3 参数1 参数2 参数3
    
  • public Method[] getMethods() throws SecurityException 返回所有public修饰的方法,包括从类和接口继承来的方法,但其中父类中静态方法能被继承,但是接口中的静态方法无法被继承。

    Class cls = Person.class;
    Method[] pubMethods = cls.getMethods();
    for (Method method : pubMethods) {
        System.out.println("修饰符:" + Modifier.toString(method.getModifiers()) +
                " 名称:" + method.getName() +
                "参数个数:" + method.getParameterCount());
    }
    //输出 接口中静态方法interfaceMethod1没有输出,但是Demo中demoMethod3输出了
    //修饰符:public 名称:method1参数个数:1
    //修饰符:public 名称:method1参数个数:1
    //修饰符:public static 名称:method5参数个数:1
    //修饰符:public 名称:method5参数个数:1
    //修饰符:public 名称:demoMethod1参数个数:0
    //修饰符:public 名称:interfaceMethod2参数个数:0
    //修饰符:public 名称:demoMethod2参数个数:0
    //修饰符:public static 名称:demoMethod3参数个数:0
    //修饰符:public final native 名称:wait参数个数:1
    //修饰符:public final 名称:wait参数个数:2
    //修饰符:public final 名称:wait参数个数:0
    //修饰符:public 名称:equals参数个数:1
    //修饰符:public 名称:toString参数个数:0
    //修饰符:public native 名称:hashCode参数个数:0
    //修饰符:public final native 名称:getClass参数个数:0
    //修饰符:public final native 名称:notify参数个数:0
    //修饰符:public final native 名称:notifyAll参数个数:0
    //修饰符:public 名称:interfaceMethod3参数个数:0
    
    
  • **public Method getMethod(String name, Class<?>… parameterTypes)throws NoSuchMethodException, SecurityException ** 根据函数名和参数类型,获取Method(能获取到的Method和上面一样)

      Class cls = Person.class;
      Person person = new Person();
      try{
          Method method = cls.getMethod("method1",String.class);
          method.invoke(person,"参数1");
      }catch (Exception e){
      }
    //输出
    //这是Method1 参数1
    

Method常用方法

  1. public Class<?> getDeclaringClass() 获取声明该方法的类

  2. public String getName() 获取方法名

  3. public Parameter[] getParameters() 获取函数的参数

  4. public int getModifiers() 获取方法修饰符

  5. **public Class<?> getReturnType() ** 获取返回值类型

  6. public Type getGenericReturnType() 获取泛型返回值类型

  7. public Type[] getGenericParameterTypes() 获取泛型参数类型

  8. public boolean isVarArgs() 是否允许带有可变数量的参数

  9. public boolean isSynthetic() 是否是合成构造函数

  10. **public boolean isDefault() ** 是否是接口中的默认函数

  11. public Annotation[] getDeclaredAnnotations() 获取所有注解

  12. public Object invoke(Object obj, Object… args)throws IllegalAccessException, IllegalArgumentException,InvocationTargetException 根据传入的对象和参数执行方法

    Class cls = Person.class;
    Person person = new Person();
    try{
        //非静态方法传对象
        Method method1 = cls.getMethod("method1",String.class);
        method1.invoke(person,"参数1");
        //静态方法对象传null就行
        Method method5 = cls.getMethod("method5",String.class);
        method5.invoke(null,"参数5");
    }catch (Exception e){
    }
    
    //输出
    //这是Method1 参数1
    //这是Method5
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值