package javase;

import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * Created by Kimi Raikkonen on 2018-01-30.
 */
public class ReflectTest {
    public static void main(String[] args) {

       // c1.getDeclaredMethod();
        try {
            // 反射的使用方式
            // 1.获取类的类类型
            A a1 = new A();
            Class c1 = a1.getClass();

            // 也可以这样获取类类型
            //Class c2 = A.class;

            // 2.获取方法的反射
            /*
            根据方法名和参数列表确定到底调用哪一个方法
             */
            Method method1 = c1.getMethod("print", new Class[]{String.class, String.class});
            //3.通过反射调用方法
            method1.invoke(a1, new Object[]{"hello", "WORLD"});
            //也可以这样写
            method1.invoke(a1, "hello", "WORLDLALA");
           // method1.invoke(a1, "hello", 1);

            // 下面是没有入参的情况
           // Method method2 = c1.getMethod("print", new Class[0]);
            // 或者
           // Method method2 = c1.getMethod("print", new Class[]{});
            // 或者
            Method method2 = c1.getMethod("print");

            // 调用
            method2.invoke(a1);
            method2.invoke(a1, new Object[0]);
            method2.invoke(a1, new Object[]{});
            // 有返回值的情况 用 Object 接收返回值
            Method method4 = c1.getMethod("print", new Class[]{String.class});
            Object returnString =  method4.invoke(a1, new Object[]{"这是输入值"});
            System.out.println(returnString);






        } catch (Exception e) {

        }
    }
}


class A {
    public String print(int a, int b) {
        System.out.println(a+b);
        return "sdfsdf";
    }

    public void print(String a, String b) {
        System.out.println(a.toUpperCase()+"  "+b);
    }
    public void print() {
        System.out.println("啦啦啦德玛西亚");
    }
    public String print(String inputString) {
        return inputString;
    }
}