初识Java反射机制——Reflection(二)

本文通过一个具体的Java反射示例,展示了如何使用反射来创建对象、操作属性和方法。包括破坏封装性、调用方法和获取方法信息等核心功能。

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

上篇文章简单给了个反射的例子,主要利用反射列出了某个类的内部类、方法和属性,接下来我们举例反射的另一些用法。

首先看一个TestReflection.java类:

package com.xingpd.code;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Scanner;

public class TestReflection {

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        String className = sc.next();
        Class clazz = Class.forName(className);
        /** 创建对象 **/
        /** 调用无参构造创建对象 **/
        Object obj = clazz.newInstance();
        System.out.println(obj);
        /** 操作属性 **/
        Field field = clazz.getDeclaredField("name");
        /** 破坏封装 **/
        field.setAccessible(true);
        System.out.println(field.get(obj));

        field.set(obj, "zhangfei");
        Object fieldValue = field.get(obj);
        System.out.println(fieldValue);
        /** 操作方法 **/

        Method method = clazz.getDeclaredMethod("setName", String.class);
        /** 等价于obj.setName("liubei"); **/
        method.invoke(obj, "liubei");

        method = clazz.getDeclaredMethod("getName");
        Object returnValue = method.invoke(obj);
        System.out.println(returnValue);

        Method method2 = clazz.getDeclaredMethod("test", String.class,
                int.class);
        /** 获取方法的修饰符 **/
        int i = method2.getModifiers();
        System.out.print(Modifier.toString(i) + " ");
        /** 获取方法的返回类型 **/
        Class c = method2.getReturnType();
        System.out.print(c.getName() + " ");
        /** 获取方法名 **/
        System.out.print(method2.getName() + "(");
        /** 获取参数列表 **/
        Class[] cs = method2.getParameterTypes();
        System.out.print(Arrays.toString(cs));
        System.out.print(")");
    }

}

在运行以后,控制台输入:com.xingpd.code.MyUser 按回车,效果如下:

这里写图片描述

MyUser类(存在于com.xingpd.code包里边):

class MyUser {
    private String name = "guanyu";
    private int age = 25;

    public final 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 MyUser(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public MyUser() {
        super();
    }

    public void test(String str, int i) throws Exception {
    }
}

反射当中,Field是属性类,它生成的对象就是某个指定类的某个属性;
Method是方法类,它生成的对象就是指定的某个类的某个方法。

method.invoke()方法的意思就是相当于引用、借助于原类的那个方法,他们的作用相同,比如说原类有一个方法叫getName(),那么通过反射拿到的method对象:

Method method = clazz.getDeclaredMethod("getName");
Object returnValue = method.invoke(obj);

这里returnValue就是getName所返回的对象,所以说反射拿到的方法和原方法一样的功能调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值