Java基础——反射机制

Java基础——反射机制

一、什么是反射机制?        

        当我们的程序运行中,我们可能需要动态获取程序信息以及调用的对象信息,这时候我们就需要利用到Java的反射机制。

        Java的反射机制可以在程序运行的过程中构造任意一个类的对象,可以查询任意一个对象所属类,可以查询任意一个类的成员变量和方法,也可以调用任意一个对象的方法。

二、什么是Class类?

        Class类和创建类时的class标签不同,它是一个特殊类,他可以存储JAVA虚拟机内存中的对象信息,并通过其他的一些类及其方法对该对象进行查询和操作。因此,Class类也是Java实现反射机制的基础。

1.创建一个Class类的三者方法

方法一:

       通过Class类中的forName()方法,参数为 包.类

方法二:

        先创建一个Student对象student,然后通过Student的getClass()方法将student的类直接赋予Class类。

方法三:

        直接调用Student类的getClass()方法。

package FanSheJiZhi;

public class Student {
    
    public static void main(String[] args) {
        //方法一
        try {
            Class c = Class.forName("FanSheJiZhi.Student");
            System.out.println(c.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //方法二
        Student student = new Student();
        Class c2 = student.getClass();
        System.out.println(c2);
        //方法三
        Class<Student> c3 = Student.class;
        System.out.println(c3.getName());
    }
}

2.Class类的实例化以及反射机制的运行

        创建Class类的同时,我们也获得了相关类的信息,我们也可以用Class类来实例化获取的对象信息。

        首先,用Constructor类来调用类的构造方法,构造方法可以为无参构造方法也可以为带参构造方法。这里先创建一个School类来用于演示。

package FanSheJiZhi;

public class School {
    private String schoolName;
    private Integer year;
    private Boolean tag;

    public School() {
    }

    public School(String schoolName, Integer year, Boolean tag) {
        this.schoolName = schoolName;
        this.year = year;
        this.tag = tag;
    }

    public void showInfo(){
        System.out.println(this.schoolName+"成立了"+this.year+"年,"+(tag?"是重点高中":"不是重点高中"));
    }

    @Override
    public String toString() {
        return "School{" +
                "schoolName='" + schoolName + '\'' +
                ", year=" + year +
                ", tag=" + tag +
                '}';
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    public Boolean getTag() {
        return tag;
    }

    public void setTag(Boolean tag) {
        this.tag = tag;
    }
}

        接下来,我们创建一个测试类,来演示。

package FanSheJiZhi;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class SchoolTest {
    public static void main(String[] args) {
        try {
            Class c = Class.forName("FanSheJiZhi.School");
            //用Construtor类来创建 构造方法 的对象,即将构造方法实例化
            //无参构造方法的对象
            Constructor constructor = c.getConstructor();
            //有参构造方法的对象
            Constructor constructor = c.getConstructor(new Class[]{String.class, Integer.class, Boolean.class});
            //将对象实例化
            Object obj = constructor.newInstance(new Object[]{});
            Object obj2 = constructor.newInstance(new Object[]{"清华白鸟", 114, true});
            //obj为无参构造方法,输出null
            System.out.println(obj);
            //通过Method类来获取Shool类中名为“shouwInfo”的方法
            Method showMsg = c.getMethod("showInfo");
            //用Method类来调用方法,showInfo()方法为无参方法,所以后面参数为null
            showMsg.invoke(obj,null);
            showMsg.invoke(obj2,null);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值