【Spring】回顾反射机制

03-01 1433阅读

一、分析方法四要素

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);
    }
}

运行结果:  

【Spring】回顾反射机制

通过以上代码可以看出,调用一个方法,一般涉及到 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);
        }
    }

    运行结果:  

    【Spring】回顾反射机制

    三、假设你知道属性名

    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);
        }
    }

    运行结果:  

    【Spring】回顾反射机制

     

    一  叶  知  秋,奥  妙  玄  心

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]