【Spring】回顾反射机制

一、分析方法四要素

package org.qiu.reflect;

/**
 * @author 秋玄
 * @version 1.0
 * @email qiu_2022@aliyun.com
 * @project Spring
 * @package org.qiu.reflect
 * @date 2022-11-11-17:26
 * @since 1.0
 */
public class SomeService {
    public void doSome(){
        System.out.println("public void doSome() 执行");
    }

    public String doSome(String s){
        System.out.println("public String doSome(String s) 执行");
        return s;
    }

    public String doSome(String s,int i){
        System.out.println("public String doSome(String s,int i) 执行");
        return s + " - " + i;
    }
}
package org.qiu.reflect;

/**
 * @author 秋玄
 * @version 1.0
 * @email qiu_2022@aliyun.com
 * @project Spring
 * @package org.qiu.reflect
 * @date 2022-11-11-17:29
 * @since 1.0
 */
public class Test {
    public static void main(String[] args) {
        // 不使用反射机制
        SomeService service = new SomeService();

        service.doSome();

        String s1 = service.doSome("Hello");
        System.out.println(s1);

        String s2 = service.doSome("Hello", 1);
        System.out.println(s2);
    }
}

运行结果:  

通过以上代码可以看出,调用一个方法,一般涉及到 4 个要素:

  • 调用哪个对象的方法

  • 哪个方法

  • 传什么参数

  • 返回什么值

 

二、使用反射机制调用 Method 

要使用反射机制调用一个方法,首先你要获取到这个方法。

在反射机制中 Method 实例代表的是一个方法。那么怎么获取 Method 实例呢?

package org.qiu.reflect;

import java.lang.reflect.Method;

/**
 * @author 秋玄
 * @version 1.0
 * @email qiu_2022@aliyun.com
 * @project Spring
 * @package org.qiu.reflect
 * @date 2022-11-11-17:36
 * @since 1.0
 */
public class Test2 {
    public static void main(String[] args) throws Exception {
        // 使用反射机制调用方法
        // 获取类
        Class<?> clazz = Class.forName("org.qiu.reflect.SomeService");

        // 获取方法 public String doSome(String s,int i)
        Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);

        // 调用方法
        Object o = clazz.newInstance();
        Object result = doSomeMethod.invoke(o, "小风", 500);

        System.out.println(result);
    }
}

运行结果:  

三、假设你知道属性名

package org.qiu.reflect;

import com.sun.deploy.util.StringUtils;

import java.lang.reflect.Method;

/**
 * @author 秋玄
 * @version 1.0
 * @email qiu_2022@aliyun.com
 * @project Spring
 * @package org.qiu.reflect
 * @date 2022-11-11-17:51
 * @since 1.0
 */
public class Test3 {
    public static void main(String[] args) throws Exception {
        /**
         * 假设已知以下信息:
         * 1、有这样一个类:org.qiu.reflect.User
         * 2、该类符合 Javabean 规范【属性私有化,对外提供公开的 setter、getter 方法】
         * 3、该类中有一个 int类型的 age属性
         *
         * 使用反射机制给 User 的 age 属性赋值!
         */
        String className = "org.qiu.reflect.User";
        String propertyName = "age";

        Class<?> clazz = Class.forName(className);


        String methodName = "set" + propertyName.toUpperCase().charAt(0) + propertyName.substring(1);

        Method setAge = clazz.getDeclaredMethod(methodName, int.class);

        Object o = clazz.newInstance();
        setAge.invoke(o,20);

        System.out.println(o);
    }
}

运行结果:  

 

一  叶  知  秋,奥  妙  玄  心

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qx_java_1024

祝老板生意兴隆,财源广进!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值