美文网首页
每日java--Day01:反射(Reflection)

每日java--Day01:反射(Reflection)

作者: 坏人_李哈哈 | 来源:发表于2019-08-26 23:01 被阅读0次

    每天下班复习java,查漏补缺,温故而知新。

    Day01:反射(Reflection)

    定义:Java语言中 一种 动态(运行时)访问、检测 & 修改它本身的能力。
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    Java反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它在编译期不需要知道运行的对象是谁,Java反射实际操作对象是.class文件(字节码文件)

    作用:动态(运行时)获取类的完整结构信息(变量、方法等
    ) & 调用对象的方法。

    对比runtime:java的反射类似于iOS中的runtime机制,都可以动态获取类信息、属性设置获取、类的动态加载(NSClassFromString(@“className”))、方法的动态调用。不同的是objective-c能动态的给class添加类和方法,Java 则不行。动态机制也不同:Objective-C runtime 对 class method 的调用是通过全局名称查询。而 Java VM 是通过类似 C++ 的虚表机制。

    实例

    package Reflection;
    
    import java.lang.reflect.Method;
    
    public class Student {
        public static void main(String[] args) throws ReflectiveOperationException, IllegalAccessException {
             // 1. 获取Student类的Class对象
            Class studentClass = Student.class;
            // 2. 通过Class对象创建Student类的对象
            Object  mStudent = studentClass.getDeclaredConstructor().newInstance();
    
            // 3.1 通过Class对象获取方法setName1()的Method对象:需传入方法名
            // 因为该方法 = 无参,所以不需要传入参数
            Method  msetName1 = studentClass.getMethod("setName1");;
    
            // 通过Method对象调用setName1():需传入创建的实例
            msetName1.invoke(mStudent);
    
            // 3.2 通过Class对象获取方法setName2()的Method对象:需传入方法名 & 参数类型
            Method msetName2 = studentClass.getMethod("setName2",String.class);
    
           // 通过Method对象调用setName2():需传入创建的实例 & 参数值
            msetName2.invoke(mStudent,"lihuazhang");
        }
        public Student() {
                System.out.println("创建了一个Student实例");
         }
         // 无参数方法
        public void setName1 (){
            System.out.println("调用了无参方法:setName1()");
        }
    
        // 有参数方法
        public void setName2 (String str){
            System.out.println("调用了有参方法setName2(String str):" + str);
        }
       
    } 
    
    测试结果.png

    相关文章

      网友评论

          本文标题:每日java--Day01:反射(Reflection)

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