• 反射笔记


    反射笔记

    反射

    例子(Person类与主类test)

    • person类
      public class Person implements Dog{   String name;   int age;   void display() {       /**        * 利用String.format方法来输出        * */       String s = String.format("姓名=%s,年龄=%d", name, age);       System.out.println(s);   } }
    • test类
    public class test {     public static void main(String[] args) throws ClassNotFoundException,             InstantiationException, IllegalAccessException,             IllegalArgumentException, InvocationTargetException {         // TODO Auto-generated method stub         /**          * 将出现的异常抛出 Class<?>其中?表示泛型,表示所有的都可以处理,可以称为通配符          * */         Class<?> c = Class.forName("reflect.Person");         /**          * c.newInstance()生成一个新的对象,c相当于Person类。同时这个类型是一个Object,返回也是Object类型,          * 所以要强制转化成Person类,转化之后还会报错,需要处理,可以抛出,可以try一下,这里选择抛出, 留给虚拟机来进行处理;          * c.newInstance(), 该方法产生的对象调用的是系统默认的无参构造函数          * */         Person wy = (Person) c.newInstance();         wy.name = "Jay Chou";         wy.age = 30;         wy.display();     } }

    ==运行结果==


    运行结果.png

    以上的示例用到了上节学习的的内容:Class.foName与String.format;同时有一个新的方法就是newInstance(),这个是调用的一个方法使之产生一个新的对象,代码有注释解释

    在Person类中如果添加了一个有参的构造函数,这是系统便不会自动生成无参的构造函数,在代码中Person wy=(Person)c.newInstance();这个是调用无参的构造函数来产生新的对象,所以当有参函数在的时候,上面代码会报错,不能跑出结果,这种时候要另外处理,如原先的主函数便不能使用,系统运行会报错,因为是没有传递出参数,如下处理:

    • Person类中添加有参构造函数同时将无参构造函数也创建出来
      public Person() {   } public Person(String name, int age) {       this.name = name;       this.age = age;   }
    • 主函数中
    /** * 构造器数组,角标为1是表示有参的构造函数,角标为0是表示无参的构造函数  * */     Constructor<?>[] c1 = c.getConstructors();     Person w = (Person) c1[1].newInstance("jack", 20);

    ==运行结果==


    运行结果.png

    在上面的代码中如果运行时,还是会出现一个数组越界的错误,没有办法运行成功,试了很多次,总算是发现问题了,因为有参与无参的构造函数的顺序原因,当有参的构造函数在无参的前面时,运行会报非法参数异常(IllegalArgumentException)的错误;无参在有参构造函数的前面时,便正常运行;原因就是因为调用顺序不确定,所以会出现这种情况

    还有一个getInterface的方法,可以获得这个类的接口的方法

    • 创建一个Dog()空接口的类,让Person类去实现
      public interface dog(){}
    /**  * 使用getinterface获得该类实现哪些接口方法类  * */     Class<?>[] inter=c.getInterfaces();     for(int i=0;i<inter.length;i++){     System.out.println(inter[i].getName());

    ==运行结果==

    备注:在简书上也发过这篇笔记以及前几篇笔记,为同一作者 

  • 相关阅读:
    使用Dictionary键值对判断字符串中字符出现次数
    Linq实现字符串拼接多条件查询
    js数据类型转换
    js前端数据类型检测typeof,instanceof,Object.prototype.toString.call
    moment.js格式化日期,获取前一个月的时间
    css 样式中height100%失效问题
    记一次react项目运行崩溃
    null和undefined区别
    windows腾讯云/阿里云服务器更换操作系统为linux
    csrf攻击原理和防御-生成token防御代码
  • 原文地址:https://www.cnblogs.com/sinon/p/5904372.html
Copyright © 2020-2023  润新知