继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【备战春招】第17天 Java高级编程(Java反射二)

谦瑞
关注TA
已关注
手记 78
粉丝 8
获赞 8
课程名称:Java工程师2022版
课程章节:Java高级编程
课程讲师:IT老齐 悟空 八戒猪 神思者 Leo
课程内容:Java反射二

一、反射的核心类
1.发射的核心类
Class类;
Method方法类;
Constructor构造方法类;
Field成员变量类。
2.Class类
最基础,也是最重要的一个类。
Class是JVM中代表”类和接口“的类。
Class对象具体包含了某个特定类的结构信息。
通过Class对象可以获取对应类的构造方法/方法/成员变量。

方法 用途
Class.forName() 静态方法,用于获取指定的Class对象
classObj.newInstance() 通过默认构造方法创建新的对象
classObj.getConstructor() 获得指定的public修饰构造方法Constructor对象
classObj.getMethod() 获取指定的public修饰方法Method对象
classObj.getField() 获取指定的public修饰成员变量Field对象

利用反射加载类创建对象,主要使用了Class.forName(),classObj.newInstance()。
首先是用于测试的ClassSample

package com.imooc.reflect;
import com.imooc.reflect.entity.Employee;
public class ClassSample {
    public static void main(String[] args) {
        try {
            //Class.forName() 方法将指定的类加载到jvm,并返回对应Class对象
            Class employeeClass = Class.forName("com.imooc.reflect.entity.Employee");
            System.out.println("Employee已被加载到jvm");
            //newInstance通过默认方法创建新的对象
            Employee emp = (Employee) employeeClass.newInstance();
            System.out.println(emp);
        } catch (ClassNotFoundException e) {
            //类名与类路径书写错误的情况下抛出”类无法找到“异常
            e.printStackTrace();
        } catch (InstantiationException e) {
            //对象无法被实例化,抛出”实例化异常“
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            //非法访问异常,当在作用域外访问对象方法或成员变量时抛出
            e.printStackTrace();
        }
    }
}

这里最需要注意的就是Class.forName()方法将指定的类加载到jvm中,并返回对应class对象。然后就是newInstance通过默认方法创建新的对象。然后就是三类异常,第一类是ClassNotFoundException,在类名与类路径书写错误的情况下抛出类无法找到的异常。第二类是InstantiationException,在对象无法被实例化的时候,抛出”实例化异常“。第三类是IllegalAccessException,非法访问异常,当在作用域为访问对象方法或成员变量时抛出异常。
然后是用于创建类的类员工实体类Employee

package com.imooc.reflect.entity;
/**
 * 员工实体类
 */
public class Employee {
    static {
        System.out.println("Employee类已被记载到jvm,并已初始化");
    }
    private Integer eno;
    private String ename;
    private Float salary;
    private String dname;
    public Employee(){
        System.out.println("Employee默认构造方法已被执行");
    }
    public Integer getEno() {
        return eno;
    }
    public void setEno(Integer eno) {
        this.eno = eno;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public Float getSalary() {
        return salary;
    }
    public void setSalary(Float salary) {
        this.salary = salary;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
}

定义了四个私有变量,eno,ename,salary,dname。并且给他们创建get和set方法。最后再创建一个不带参数的默认构造方法。
3.Constructor构造方法类
Constructor类是对Java类中的构造方法的抽样。
Contructor对象包含了具体类的某个具体构造方法的声明。
通过Constructor对象调用带参构造方法创建对象。

方法 用途
classObj.getConstructor() 获取指定public修饰的构造方法对象
constructorObj.newInstance() 通过对应的构造方法创建对象
    public Employee(Integer eno,String ename,Float salary,String dname){
        this.eno = eno;
        this.ename = ename;
        this.salary = salary;
        this.dname = dname;
        System.out.println("Employee带参构造方法已被执行");
    }

带参构造方法写好之后,重写tostring方法,在代码当前页调出actions的快捷键是ctrl+shift+a,调出后直接输出tostring然后选中重写的部分确定即可。

实例化对象李磊

package com.imooc.reflect;
import com.imooc.reflect.entity.Employee;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ConstructorSample {
    public static void main(String[] args) {
        try {
            Class employeeClass = Class.forName("com.imooc.reflect.entity.Employee");
            try {
                Constructor constructor = employeeClass.getConstructor(new Class[]{
                    Integer.class,String.class,Float.class,String.class
                });
                Employee employee = null;
                try {
                    employee = (Employee)constructor.newInstance(new Object[]{
                        100,"李磊",3000f,"研发部"
                    });
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    //当被调用的方法内部抛出了异常而没有被捕获时
                    e.printStackTrace();
                }
                System.out.println(employee);
            } catch (NoSuchMethodException e) {
                //没有找到与之对应格式的方法
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

注意InvocationTargetException异常,当被调用的方法内部抛出了异常而没有被捕获的时候,就会抛出这个异常。
4.Method方法类
Method对象指代某个类中的方法的描述。
Method对象使用classObj.getMethod()方法获取。
通过Method对象调用指定对象的对应方法。

方法 用途
classObj.getMethod() 获取指定public修饰的方法对象
methodObj.invoke() 调用指定对象的对应方法
    public Employee updateSalary(Float val){
        this.salary = this.salary + val;
        System.out.println(this.ename + "调薪至" + this.salary + "元");
        return this;
    }

新增调薪方法,要加薪就传入正数,要降薪传入负值给val。

课程总结:

1.反射核心类
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP