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();
}

java 反射简说的更多相关文章

  1. java反射简解

    1.首先一个问题,什么是类,类是不是对象? 我们总是说我们new一个对象出来 那么我们还没有new的时候,建造的那个java类是不是对象呢? 是 它是java.lang.Class的对象 对于反射我们 ...

  2. Android简易注解View(java反射实现)

    一.引言 Android中通过findViewById在布局文件中找到需要的View,加入一个Activity里面有许多的View需要初始化,那将是一件很繁琐的事情.当然Google一下你会发现有很多 ...

  3. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  4. 【转】JAVA反射与注解

    转载自:https://www.daidingkang.cc/2017/07/18/java-reflection-annotations/ 前言 现在在我们构建自己或公司的项目中,或多或少都会依赖几 ...

  5. Java反射拾遗

    定义:Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息.反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set ...

  6. Java反射03 : 获取Class的注解、修饰符、父类、接口、字段、构造器和方法

    java.lang.Class类提供了获取类的各种信息对象的静态方法. 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79363921 ...

  7. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  8. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  9. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

随机推荐

  1. nginx的前世今生

    Nginx最初的设计是称为一个http服务器,一个能够解决C10K问题的http服务器. 那么问题来了,什么是C10K呢?C10K问题即(单机10万个并发链接问题),这个概念最早是由Dan Kegel ...

  2. caffe win添加新层

    1.编写.h和.cpp .cu文件 将.hpp文件放到路径caffe-windows\caffe-master\include\caffe\layers下 将.cpp文件和.cu放到路径caffe-w ...

  3. sql server中的varchar和Nvarchar有什么区别?

    很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大 ...

  4. pc端结合canvas实现简单签名功能

    需求:业务员做提交时要签名... 代码不多简单易懂,直接看代码 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  5. 使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示

    使用MobaXterm远程连接Ubuntu,启动Octave,界面不能正常显示,键盘输入无法显示,解决方法如下. 在启动octave之前,输入这两个命令: export GTK_MODULES=gai ...

  6. 跟随我在oracle学习php(13)

    常用的css样式 [class~="col-6"]:选择我所有类名中包含有col-6独立单词的元素 [class*="col-"]:选择所有类名中含有" ...

  7. 带你领略Linux系统发展及版本更迭

    Linux的出现是在1991年,Linus Torvalds的学生开发的,最初的Linux是类似Unix操作系统,可用于386,486或奔腾处理器的计算机上.Linus Torvalds是一个伟人,他 ...

  8. K2签约龙光地产,为集团实现“千亿目标”保驾护航

    随着房地产行业步入成熟期,行业整合及转型速度变快,房企要在数字经济的背景下实现稳步发展,企业信息化建设是其中的重要一环.此次龙光地产选择与K2携手,用统一流程平台为集团保驾护航,向实现千亿目标迈进. ...

  9. vs code编写的时候自动回车的原因

    今天在书写一个空白的scss文件的时候,刚打2个字就自动回车换行了: 测试了几次,发现了规律就是输入停下来0.5秒左右就会自动换行,比如,打了2个中文,再连续打一个句子,键盘虽然在动,但是vs cod ...

  10. react native第一天--------KnightRider

    今天是2017年6月8,是我的项目react native-CRM(用户关系管理)的第一天,一早就配置了一上午Mac的环境,然后运行项目,在react-native init project的时候一直 ...