java 反射简说

Posted on 2018-11-27 16:22  老大闯天下  阅读(109)  评论(0编辑  收藏  举报

1 Class类

就是类的类型。研究反射先了解下Class类。

获取类的类型的三种方法:

Class c1 = 对象.getClass();

Class c2 = Class.forName("包名.类名");

Class c3 = 类.class();

Class类的newInstance();方法调用缺省构造函数,返回该Class对象的一个Object类型的实例。

 

2 反射

在运行时构造任意一个类的对象;获取类的属性,方法;调用方法。

 

3 举例

person类

public class Person {
    private static String TAG = "person";

    public String name = "";

    private int age = 18;

    public Person(){

    }

    public Person(Integer age){
        this.age = age;
    }

    private void see(){
        Log.e(TAG, "person see()");
    }

    public void run(){
        Log.e(TAG, "person run()");
    }

    public void setAge(int age){
        Log.e(TAG, "person setAge():" + age);
        this.age = age;
    }

    public void setPerson(String name, Integer age){
        Log.e(TAG, "person setPerson():name:" + name + ", age" + age);
        this.name = name;
        this.age = age;
    }
}

另一类

private void getPerson(){

  // 获取Person类的类类型
  Class c1 = Person.class;

 

  try {
    // 实例c1指向的类型
      Object object = c1.newInstance();
    // 获取run方法(无参)
      Method method = c1.getDeclaredMethod("run");
    // 运行run方法
      method.invoke(object);

    // 获取setAge方法(一个参数)
      Method method1 = c1.getDeclaredMethod("setAge", int.class);
    // 运行setAge,设置为20
      method1.invoke(object, 20);

    // 获取setAge方法(二个参数)
      Method method2 = c1.getDeclaredMethod("setPerson", String.class, Integer.class);
      method2.invoke(object, "xiaohong", 30);

  } catch (NoSuchMethodException e) {
      e.printStackTrace();
  } catch (IllegalAccessException e) {
      e.printStackTrace();
  } catch (InvocationTargetException e) {
      e.printStackTrace();
  } catch (InstantiationException e) {
      e.printStackTrace();
  }

  try {
      invokeMethod(new Person(), "setPerson", "dayun", 20);
  } catch (Exception e) {
      e.printStackTrace();
  }
}

// 工具类

public Object invokeMethod(Object object, String methodName, Object... args) throws Exception {
    Class c = object.getClass();
    Class[] argsClass = new Class[args.length];
    for (int i = 0, j = args.length; i < j; i++) {
        argsClass[i] = args[i].getClass();
    }
    Method m = c.getMethod(methodName, argsClass);
    return m.invoke(object, args);
}


反射int类型需要处理,int.getClass为Integer,代用工具类时需要注意int类型参数

if(args[i].getClass().equals(Integer.class)){
    argsClass[i] = int.class;
}else{
    argsClass[i] = args[i].getClass();
}