Java实现反射的方式和反射的基本应用

本文介绍了Java中的反射机制,包括如何通过Class对象获取类信息,如获取属性和方法,并展示了如何利用反射进行属性赋值和方法调用。示例代码详细演示了三种获取Class对象的方式,以及对User类的属性和方法的访问操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备

先准备一个实体类User.java:

package com.example.reflect;

public class User {
    private String id;
    public String name;
    private String telephone;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
}

获取Class对象方式

反射第一步:获取某个类的Class对象————有3种获取方式

  • 法1:Class<?> clazz = Class.forName(“完整类路径”);

Class<?> clazz1 = Class.forName(“com.example.reflect.User”);

  • 法2:Class<?> clazz = 类名.class;

Class<?> clazz2 = User.class;

  • 法3:Class<?> clazz = 类的实例名.getClass();

User user = new User();
Class<?> clazz3 = user.getClass();

代码示例

接下来使用User实体类对反射实现方法进行演示:

package com.example.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //===============反射第一步:获取某个类的Class对象————有3种获取方式

        //********法1:Class<?> clazz = Class.forName("完整类路径");
        Class<?> clazz1 = Class.forName("com.example.reflect.User");

        //********法2:Class<?> clazz = 类名.class;
        Class<?> clazz2 = User.class;

        //********法3:Class<?> clazz = 类的实例名.getClass();
        User user = new User();
        Class<?> clazz3 = user.getClass();






        //===============获取某个类的属性(包含属性的 修饰符、类型、属性名 等信息)
        //*** 1.获取所有属性
        Field[] fields = clazz1.getDeclaredFields();

        //*** 2.获取特定属性名的字段对象————方便对特定值重新赋值
        Field nameField = clazz1.getField("name");
        //获取属性的修饰符、类型、名称
        String attributeModifier = Modifier.toString(nameField.getModifiers());
        Class<?> attributeType = nameField.getType();
        String attributeName = nameField.getName();

        //对name重新赋值——先创建实例对象,再赋值
        User user1 = (User)clazz1.newInstance();
        nameField.set(user1,"神乐");






        //===============获取某个类的方法(包含方法的 修饰符、返回类型、方法名 等信息)
        //*** 1.获取所有方法
        Method[] methods = clazz1.getDeclaredMethods();

        //*** 2.获取【特定方法名,特定参数类型】的方法对象————方便调用特定方法
        Method setNameMethod = clazz1.getMethod("setName",String.class);

        //调用特定方法——先创建实例对象,再调用方法
        setNameMethod.invoke(user1,"新巴基");

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值