美文网首页
Java 反射机制

Java 反射机制

作者: lijingbo | 来源:发表于2018-07-18 13:59 被阅读0次

    一、定义与概念

    反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

    Class类:Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。

    二、使用

    1.获取Class 对象的方式

    a.Object ——> getClass();

    b.任何数据类型(包括基本数据类型)都有一个“静态”的class属性:例如Person.class

    c.通过Class类的静态方法:forName(String  className)(常用) :  Class.forName();

    注意:在运行期间,一个类,只有一个Class对象产生。

    三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。

    2.获取构造方法

     a.批量的方法:

    public Constructor[] getConstructors():所有"公有的"构造方法

     public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

     b.获取单个的方法,并调用:

    public Constructor getConstructor(Class... parameterTypes):获取单个的"公有的"构造方法:

    public Constructor getDeclaredConstructor(Class... parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

     调用构造方法:

    Constructor-->newInstance(Object... initargs)

    newInstance是Constructor类的方法(管理构造函数的类)

    api的解释为:

    newInstance(Object... initargs)

     使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

    它的返回值是T类型,所以newInstance是创建了一个构造方法的声明类的新实例对象。并为之调用

    3.获取方法

    Class stu = Class.forName("csdn.Student");

    // 获取对象的所有公共方法

    Method[] methods = stu.getMethods();

    for(Method m : methods) {

    System.out.println(m);

    }

    System.out.println("---------------------");

    // 获取对象所有方法,但不包含继承的

    Method[] declaredMethods = stu.getDeclaredMethods();

    for(Method ms : declaredMethods) {

    System.out.println(ms);

    }

    4.获取属性

    //1.获取Class对象

    Class stuClass = Class.forName("fanshe.field.Student");

    //2.获取字段

    System.out.println("************获取所有公有的字段********************");

    Field[] fieldArray = stuClass.getFields();

    for(Field f : fieldArray){

    System.out.println(f);

    }

    System.out.println("************获取所有的字段(包括私有、受保护、默认的)********************");

    fieldArray = stuClass.getDeclaredFields();

    for(Field f : fieldArray){

    System.out.println(f);

    }

    System.out.println("*************获取公有字段**并调用***********************************");

    Field f = stuClass.getField("name");

    System.out.println(f);

    //获取一个对象

    Object obj = stuClass.getConstructor().newInstance();//产生Student对象--》Student stu = new Student();

    //为字段设置值

    f.set(obj,"刘德华");//为Student对象中的name属性赋值--》stu.name = "刘德华"

    //验证

    Student stu = (Student)obj;

    System.out.println("验证姓名:"+ stu.name);

    System.out.println("**************获取私有字段****并调用********************************");

    f = stuClass.getDeclaredField("phoneNum");

    System.out.println(f);

    f.setAccessible(true);//暴力反射,解除私有限定

    f.set(obj,"18888889999");

    System.out.println("验证电话:"+ stu);

    相关文章

      网友评论

          本文标题:Java 反射机制

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