【java学习笔记】初学java反射机制

java反射机制定义:

    Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。

在了解反射机制前,需要了解Class对象是什么。我们知道可以使用javac编译命令将一个java文件编译为.class文件即字节码文件。而在反射机制中,会主要使用到.class文件。首先了解获取Class类的方法。

package com.wen.javaTest;

public class Teacher {
    String name;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Teacher() {
    }
    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

当前有一个Teacher类,就用该类讲解获取其对应的Class类的方法。

获取Class类的三种方法:

第一种:通过类的静态class属性获取

        Class c = Teacher.class;
        System.out.println(c);

输出结果:

第二种: 通过实例化对象的getClass()方法获取

        Class c2 = new Teacher().getClass();
        System.out.println(c2);

输出结果:

 第三种: 通过Class类的静态方法forName(String className)获取

  Class c3 = null;
        try {
            c3 = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(c3);

输出结果:

获取class类后,就可以得到通过反射获取到class文件里的所有内容,包含构造方法、属性、普通方法等。

反射获取构造方法信息:(使用Constructor类)

  Class c = null;
        try {
            c = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
            // 得到指定的构造方法
            Constructor constructor = c.getConstructor(String.class, int.class);
            // 得到对象
            Teacher teacher = (Teacher) constructor.newInstance("WEN",18);
            System.out.println("姓名:"+teacher.getName() + "\n年龄:"+teacher.getAge());
        } catch (Exception e) {
            e.printStackTrace();
        }

反射获取普通方法信息:(使用Method类)

  Class c = null;
        try {
            c = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
            // 得到对象
            Teacher teacher = (Teacher)c.newInstance();
            //获取指定参数的普通方法
            Method method = c.getDeclaredMethod("setAge",int.class);
            //使用invoke方法调用set方法进行赋值
            method.invoke(teacher,18);
            System.out.println(teacher.getAge());
        } catch (Exception e) {
            e.printStackTrace();
        }

反射获取属性信息: (使用Field类)

 Class c = null;
    try {
        c = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
        // 得到对象
        Teacher teacher = (Teacher)c.newInstance();
        //获取指定参数的普通方法
        Field field = c.getDeclaredField("age");
        //设置方法允许操作私有属性
        field.setAccessible(true);
        field.set(teacher,18);
        System.out.println(teacher.getAge());
    } catch (Exception e) {
        e.printStackTrace();
    }

反射获取父类的Class类信息:

 Class c = null;
    try {
        c = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
        Class superClass = c.getSuperclass();
        System.out.println(superClass);
    } catch (Exception e) {
        e.printStackTrace();
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值