美文网首页Java篇
Java中的反射机制

Java中的反射机制

作者: w达不溜w | 来源:发表于2021-04-17 23:03 被阅读0次

      Java的反射机制是在运行状态中,对于任意一个类,都能获取这个类的所有属性和方法,对于任意一个对象,能够调用它的任意一个方法和属性,包括私有方法和属性,这种动态地获取信息以及动态的调用对象的方法的工程称之为Java的反射机制。

    实例应用

    //--Student测试类定义
    public class Student {
        //私有属性
        private String name;
        // 无参构造函数
        public Student() {
            System.out.println("调用了无参构造函数");
        }
        // 有参构造函数
        public Student(String str) {
            System.out.println("调用了有参构造函数");
        }
        // 无参数方法
        public void setName1() {
            System.out.println("调用了无参方法:setName1()");
        }
        // 有参数方法
        public void setName2(String str) {
            System.out.println("调用了有参方法setName2(String str):" + str);
        }
    }
    

    实例1:利用反射获取类的属性&赋值

    public static void main(String[] args) {
        try {
            // 1.获取Student类的Class对象
            Class<Student> studentClass = Student.class;
            // 2.通过Class对象创建Student类的对象
            Student mStudent = studentClass.newInstance();
            // 3.通过Class对象获取Student类的name属性
            Field f = studentClass.getDeclaredField("name");
            // 4.设置私有访问权限
            f.setAccessible(true);
            // 5.对新创建的Student对象设置name值
            f.set(mStudent,"bestchangge");
            // 6.获取新创建Student对象的name属性
            System.out.println(f.get(mStudent));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    测试结果:

    调用了无参构造函数
    bestchangge

    实例2:利用反射调用类的构造函数

    public static void main(String[] args) {
        try {
            // 1 获取Student类的Class对象
            Class<Student> studentClass = Student.class;
            // 2.1 通过Class对象获取Constructor类对象,从而调用无参构造(构造函数的调用实际上是在newInstance())
            Student student1 = studentClass.getConstructor().newInstance();
            // 2.2 通过Class对象获取Constructor类对象(传入参数类型),从而调用有参构造
            Student student2 = studentClass.getConstructor(String.class).newInstance("bestchangge");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    测试结果:

    调用了无参构造函数
    调用了有参构造函数,传值为:bestchangge

    实例3:利用反射调用类对象的方法

    public static void main(String[] args) {
        try {
            // 1 获取Student类的Class对象
            Class<Student> studentClass = Student.class;
            // 2 通过Class对象获取Constructor类对象,从而调用无参构造(构造函数的调用实际上是在newInstance())
            Student mStudent = studentClass.getConstructor().newInstance();
            // 3.1 通过Class对象获取方法setName1()的Method对象
            Method method1 = studentClass.getMethod("setName1");
            // 通过Method对象调用setName1()
            method1.invoke(mStudent);
    
            // 3.2 通过Class对象获取方法setName2()
            Method method2 = studentClass.getMethod("setName2", String.class);
            // 通过Method对象调用setName2()
            method2.invoke(mStudent,"bestchangge");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    测试结果:

    调用了无参构造函数
    调用了无参方法:setName1()
    调用了有参方法setName2(String str):bestchangge

    相关文章

      网友评论

        本文标题:Java中的反射机制

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