美文网首页
反射笔记

反射笔记

作者: 坂田银时哈哈 | 来源:发表于2016-09-24 22:41 被阅读0次

反射

例子(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()); 

==运行结果==

运行结果.png

相关文章

  • Android Kotlin 反射使用笔记

    前言 java反射的写法,做下笔记 反射用法

  • 反射笔记

    反射——Java高级开发必须懂的1 类实际上都是java.lang.class的实例对象。Class类实例的表示:...

  • 反射笔记

    反射 例子(Person类与主类test) person类 test类 ==运行结果== 以上的示例用到了上节学习...

  • [JAVA学习笔记] 反射机制

    [JAVA学习笔记] 反射机制 Java的反射通过Class类和java.lang.reflect类库实现。通过它...

  • 《Java编程思想》读书笔记 第十四章 02 反射

    《Java编程思想》读书笔记 第十四章 02 反射 反射机制 反射机制是在运行状态中,对于任意一个类,都能够知道这...

  • Golang 学习笔记(11)—— 反射

    转载请注明出处:Golang 学习笔记(11)—— 反射 介绍 反射是程序执行时检查其所拥有的结构。尤其是类型的一...

  • Java 反射笔记

    2017年12月1日 10:52:57 Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们...

  • 反射机制笔记

    在一个Android群里面, 经常有大佬们吐槽: 同事明明可以通过函数获取到一个类的变量, 但非要装x用反射. 当...

  • JAVA反射_笔记

    在JAVA中,一切都是对象,那么你新建的一个class也是对象吗? 是的,新建的class也是对象,它是java....

  • Java反射笔记

    Java反射机制是指在运行状态中,对于任意一个类,都知道这个类的所有属性和方法;对于任意一个对象,都能调用它的属性...

网友评论

      本文标题:反射笔记

      本文链接:https://www.haomeiwen.com/subject/wgaxyttx.html