Java第四课 - Java反射的学习(一)

本文深入讲解Java反射机制,包括其定义、如何通过反射获取类的名称、方法和属性,以及如何利用反射创建对象。通过实例演示,展示了反射在动态获取信息及调用对象方法上的强大功能。

Java第四课 - Java反射的学习(一)

定义

先来看下百度百科的定义。

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

翻译一下,就是通过反射机制,来获取类的名称,方法,修饰符等等。

这么说可能会有点抽象,我们来举个栗子。

举个栗子

定义SysUser类

这个是一个基础的系统用户的类,用来描述系统用户的账号、密码。

注意,这里的userName,我定义为了public类型。

public class SysUser {
    private int userId;
    public String userName;
    private String password;
    public void sayHello(){
        System.out.println("hello");
    }
}

定义main方法

由于是演示,这里就直接放在main方法,方便演示。

定义对象,获取Class
SysUser sysUser = new SysUser();
Class<? extends SysUser> sysUserClass = sysUser.getClass();

得到sysUserClass这个对象之后,可以做什么呢?我们进入一下Class这个类去看看。

在这里插入图片描述

可以看到,有许许多多的方法,我们挑选几个来说明一下。

获取对象的名称,包含整个包名。
String sysUserClassName = sysUserClass.getName();
System.out.println(sysUserClassName);

打印结果为

com.mowie.javastudy.javaclass.SysUser

接着,我们来试着打印一下字段,即属性。
Field[] fields = sysUserClass.getFields();
for (Field field : fields) {
    System.out.println(field.getName());
}

打印结果为

userName

可以看到,结果是一个数组我们是定义了三个字段,但是这里只显示了一个。说明,getFields()方法只会显示public修饰的字段。

接着,我们再来打印一下方法。
Method[] methods = sysUserClass.getMethods();
for (Method method : methods) {
    System.out.println(method.getName());
}

打印结果为

main
sayHello
wait
wait
wait
equals
toString
hashCode

所以也可以看到getMethods()方法,同时也会把超级父类Object的方法也给打印出来的。

main方法的代码如下。

public static void main(String[] args) {
    
    SysUser sysUser = new SysUser();
    Class<? extends SysUser> sysUserClass = sysUser.getClass();
    String sysUserClassName = sysUserClass.getName();
    System.out.println(sysUserClassName);
    Field[] fields = sysUserClass.getFields();
    for (Field field : fields) {
        System.out.println(field.getName());
    }
    Method[] methods = sysUserClass.getMethods();
    for (Method method : methods) {
        System.out.println(method.getName());
    }
}

通过类名创建对象

我们换个思路,平时我们创建对象,都是通过new关键词。

如果我们现在已经知道了包名以及类名,是否可以通过反射来创建对象呢?答案是肯定的。

举个栗子

同样的,我们也直接在main方法里面进行演示就好了。

首先,是把包名以及类型定义好。接着,通过Class.forName()方法,把Class对象给创建出来。

Class有了之后,再通过newInstance()方法,进行实例化对象。

我们也可以看到,这里实例化出来的对象,是一个Object类型的对象。所以我们需要进行强制转换。

强制转换后,我们调用SysUser的方法sayHello。可以看到,打印出来的结果就是:hello。

这就说明了,我们的对象创建成功啦!

public static void main(String[] args) {
    String className = "com.mowie.javastudy.javaclass.SysUser";
    try {
        Class<?> aClass = Class.forName(className);
        Object o = aClass.newInstance();
        SysUser sysUser = (SysUser) o;
        sysUser.sayHello();
    }catch (Exception e){
        e.printStackTrace();
    }
}

总结

通过反射,其实是可以做到很多很灵活的操作的,例如在代码中获取对象名、对象方法等等。

具体看操作场景,我们这里也就先熟悉一下,以后要运用的时候,知道有反射这个东西就可以了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值