美文网首页
Java反射机制

Java反射机制

作者: 何止搬砖工 | 来源:发表于2020-07-16 00:38 被阅读0次

    一、概述

    Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等。

    二、获取Class对象

    Class为字节码类型,字节码文件(xxx.class文件),加载到内存中时,会创建字节码对象(应该是加载到方法区?)。

    1、获取方法Class对象的三种方式:

            Person person1 = new Person();
            Person person2 = new Person();
    //        第一种
            Class class1 = person1.getClass();
            Class class2 = person2.getClass();
    
            System.out.println(class1 == class2);
    //        第二种
            Class class3 = Person.class;
            System.out.println(class3 == class2);
    //        第三种
            Class class4 = Class.forName("com.example.customer.myjava.Person");
    
            System.out.println(class4 == class3);
    

    结果:

    true
    true
    true
    

    2、Class的成员

    (1)、Constructor对象,构造器对象
    (2)、Method 对象,成员方法对象
    (3)、Field 对象,成员变量对象

        Class clazz = Class.forName("com.example.customer.myjava.Person");
            try {
                /**
                 * 获取构造器对象
                 * */
                Constructor constructor = clazz.getDeclaredConstructor();
                /**
                 * 因为是私有的 所以要设置为true
                 * */
                constructor.setAccessible(true);
                /**
                 * 创建Person对象
                 * */
                Object obj = constructor.newInstance();
    
                /**
                 * 获取成员方法
                 * */
                Method eat = clazz.getDeclaredMethod("eat",String.class);
                eat.setAccessible(true);
                /**
                 * 执行成员方法
                 * */
                eat.invoke(obj,"fan");
                /**
                 * 获取变量
                 * */
                Field age = clazz.getDeclaredField("age");
                age.setAccessible(true);
                age.set(obj,3);
    
                Person person = (Person)obj;
                System.out.println("age:"+person.getAge());
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    

    相关文章

      网友评论

          本文标题:Java反射机制

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