Java篇

Java中的反射机制

2021-04-17  本文已影响0人  w达不溜w

  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

上一篇下一篇

猜你喜欢

热点阅读