Spring学习记录---回顾反射机制

目录

10.回顾反射机制

10.1 分析方法四要素

//不使用反射机制调用这些方法

使用反射机制调用方法

代码:

运行结果:

 10.4 假设你知道属性名

测试代码

运行结果


10.回顾反射机制

10.1 分析方法四要素

package com.dong.reflect;

public class SomeService {
    public void doSome(){
        System.out.println("public void doSome() 执行!!");
    }
    public String doSome(String s){
        System.out.println("public String doSome() 执行!!");
        return s;
    }
    public String doSome(String s,int i){
        System.out.println(" public String doSome(String s,int i) 执行!!");
        return s+i;
    }
}
  • //不使用反射机制调用这些方法

package com.dong.reflect;

public class Test {
    public static void main(String[] args) {

        //不使用反射机制调用这些方法
        SomeService someService=new SomeService();
        someService.doSome();
        /**
         * 调用一个方法,一般涉及到4个要素:
         * ● 调用哪个对象的(someService)
         * ● 哪个方法(doSome)
         * ● 传什么参数(**)
         * ● 返回什么值(*)
         * 总结:调用哪个对象的哪个方法、传什么参数、返回什么值。
         *
         * 即使使用反射机制调用方法,也需要具备上述4个要素
         */
        String s1 = someService.doSome("张三");
        System.out.println(s1);
        String s2 = someService.doSome("李四", 180);
        System.out.println(s2);

    }
}
/**
 * 调用一个方法,一般涉及到4个要素:
 * ● 调用哪个对象的(someService)
 * ● 哪个方法(doSome)
 * ● 传什么参数(**)
 * ● 返回什么值(*)
 * 总结:调用哪个对象的哪个方法、传什么参数、返回什么值。
 *
 * 即使使用反射机制调用方法,也需要具备上述4个要素
 */
  • 使用反射机制调用方法

    • 代码:

package com.dong.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Test2 {
    public static void main(String[] args) throws Exception {
        //使用反射机制调用方法
          //先获取类
        Class clazz = Class.forName("com.dong.reflect.SomeService");

        //获取方法
        Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);
        //调用方法
        //四要素:调用哪个对象、哪个方法、传什么参数、返回什么值。
                 // obj 要素:哪个对象
                // doSomeMethod 要素:哪个方法
                // "李四身高:", 180 要素:传什么参数
                // retValue 要素:返回什么值
        Object obj = clazz.newInstance();
        /*
         *          'newInstance()' 已弃用--->用以下方式创建对象:
         *         Constructor con = clazz.getDeclaredConstructor();
         *         Object obj = con.newInstance();
         */
        Object retValue = doSomeMethod.invoke(obj, "李四身高:", 180);
        System.out.println(retValue);
    }
}
    • 运行结果:

Spring学习记录---回顾反射机制_第1张图片

  • 小练习
    • 代码
package com.dong.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Test3 {
    public static void main(String[] args) throws Exception{
        //测试  用反射机制调用doSome()没有参数的方法

        //获取类
        Class clazz = Class.forName("com.dong.reflect.SomeService");
        //获取方法
        Method doSomeMethod = clazz.getDeclaredMethod("doSome");
        //调用方法
        Constructor con = clazz.getDeclaredConstructor();
        Object obj = con.newInstance();
        doSomeMethod.invoke(obj);
    }
}
  • 运行结果 

Spring学习记录---回顾反射机制_第2张图片


 10.4 假设你知道属性名

假设有这样一个类:

package com.dong.reflect;

public class User {
    private String name;
    private int age;

    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

你知道以下这几条信息:

  • 类名是:com.powernode.reflect.User
  • 该类中有String类型的name属性和int类型的age属性。
  • 另外你也知道该类的设计符合javabean规范。(也就是说属性私有化,对外提供setter和getter方法)

你如何通过反射机制给User对象的name属性赋值zhangsan,给age属性赋值30岁。

  • 测试代码

v-1.0

package com.dong.reflect;

import java.lang.reflect.Method;

public class Test4 {
    public static void main(String[] args) throws Exception{
        /*
           需求:
              假设你现在知道一下信息:
                1、有这样一个类:类名叫:com.dong.reflect.User
                2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法
                3、你还知道这个类当中有一个属性,属性名叫:age
                4、并且你还知道age的属性类型为int类型
             请用反射机制调用相关方法,给user对象的age属性赋值
         */

        String className="com.dong.reflect.User";
        String propertyName="age";

        //通过反射机制调用setAge(int)方法
          //获取类
        Class clazz = Class.forName(className);

         //获取方法
           //先根据属性名获取方法名
              // [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAge
        String setMethodName="set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);

        Method setMethod = clazz.getDeclaredMethod(setMethodName, int.class);

        //调用方法
        Object obj = clazz.newInstance();
        setMethod.invoke(obj, 30);
        System.out.println(obj);
    }
}

v-2.0  让属性类型动态获取---根据属性名获取属性类型

      //根据属性名获取属性类型---clazzField 是一个 Field 对象,它代表了 clazz 类中的名为 propertyName 的属性

Field clazzField = clazz.getDeclaredField(propertyName);

//这段代码是通过反射机制获取一个类(clazz)中指定属性(propertyName)的Field对象(clazzField)。它使用了Java中的getDeclaredField方法,该方法可以获取类中声明的所有字段,包括私有字段。通过这段代码,可以动态地获取和操作类中的属性。

Method setMethod = clazz.getDeclaredMethod(setMethodName,clazzField.getType());
package com.dong.reflect;

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

public class Test4 {
    public static void main(String[] args) throws Exception{
        /*
           需求:
              假设你现在知道一下信息:
                1、有这样一个类:类名叫:com.dong.reflect.User
                2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法
                3、你还知道这个类当中有一个属性,属性名叫:age
                4、并且你还知道age的属性类型为int类型
             请用反射机制调用相关方法,给user对象的age属性赋值
         */

        String className="com.dong.reflect.User";
        String propertyName="age";

        //通过反射机制调用setAge(int)方法
          //获取类
        Class clazz = Class.forName(className);

         //获取方法
           //先根据属性名获取方法名
              // [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAge
        String setMethodName="set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);
              //根据属性名获取属性类型
        Field clazzField = clazz.getDeclaredField(propertyName);

        Method setMethod = clazz.getDeclaredMethod(setMethodName,clazzField.getType());

        //调用方法
        Object obj = clazz.newInstance();
        setMethod.invoke(obj, 30);
        System.out.println(obj);
    }
}
  • 运行结果

Spring学习记录---回顾反射机制_第3张图片

你可能感兴趣的:(spring学习记录,学习)