spring之反射机制之Spring-DI核心实现-创新互联

文章目录
  • 前言
  • 一、回顾反射机制之反射调用方法
    • 1、编写一个方法类SomeService
    • 2、通过反射机制调用SomeService类中的方法
  • 二、反射机制之Spring-DI核心实现

成都创新互联是一家专注于网站制作、做网站与策划设计,平遥网站建设哪家好?成都创新互联做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:平遥等地区。平遥做网站价格咨询:13518219792
前言

调用一个方法当中含有几个要素?
1、调用哪个对象
2、调用哪个方法
3、调用方法的时候传什么参数
4、方法执行结束之后的返回结果
调用哪个对象的哪个方法,传什么参数,返回什么值
即使是使用反射机制调用方法,也同样需要具备这四个要素


一、回顾反射机制之反射调用方法

使用反射机制怎么调用方法

1、编写一个方法类SomeService
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;
    }
}
2、通过反射机制调用SomeService类中的方法

1、获取类:

Classclazz = Class.forName("com.bjpowernode.spring.reflect.SomeService");

2、获取方法:

getDeclaredMethod:
第一个参数:方法名
第二个参数:方法中的参数
在一个类当中,方法名是可以一样的。Java语法中允许方法重载,因此只通过方法名是获取不到方法的,需要借助第二个参数。告诉Java程序到底是哪个doSome方法。通过参数来区分方法。

Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);

3、调用方法:
四要素:调用哪个对象的哪个方法,传什么参数,返回什么值
获取对象的两种方法:

Object obj = clazz.newInstance();

如果觉得该方法已经过时,还可以通过获取类的无参数构造方法创建对象:

//获取无参数构造方法创建对象
        Constructorcon = clazz.getDeclaredConstructor();
        Object obj2 = con.newInstance();
四要素:
    //obj:哪个对象
    //doSomeMethod:哪个方法
    //"小白", 23:传什么参数
    //retValue:返回什么值
Object retValue = doSomeMethod.invoke(obj, "小白", 23);

执行结果:
在这里插入图片描述
完整代码:

public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {//获取类
        Classclazz = Class.forName("com.bjpowernode.spring.reflect.SomeService");
        //获取方法 (参数:方法名,可变长)
        Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);
        //调用方法
        //四要素:调用哪个对象的哪个方法,传什么参数,返回什么值
        Object obj = clazz.newInstance();
        //获取无参数构造方法创建对象
        //Constructorcon = clazz.getDeclaredConstructor();
        //Object obj2 = con.newInstance();
        Object retValue = doSomeMethod.invoke(obj, "小白", 23);
        System.out.println(retValue);
    }
}
二、反射机制之Spring-DI核心实现

需求:
假设现在已知以下信息:

1、有这样一个类,类名叫做:com.bjpowernode.spring.reflect.User
2、这个类符合javabean规范。属性私有化,对外提供公开的setter和getter方法
3、知道这个类当中有一个属性,age
4、并且还知道age属性的类型是int类型

通过反射机制调用相关方法,给User对象的age属性赋值
关键在于
1、通过已知的属性名拼接出方法名:

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

2、根据属性名获取属性类型:

//根据属性名获取属性类型
        Field field = clazz.getDeclaredField("age");

然后直接 field.getType() 就是属性类型=int.Class

完整代码:

public class Test4 {public static void main(String[] args) throws Exception {//已知类名:
        String className = "com.bjpowernode.spring.reflect.User";
        //已知属性名:
        String propertyName = "age";

        //通过反射机制调用setAge(int)方法
        Classclazz = Class.forName(className);
        //拼接set方法名
        String setMethodName = "set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);
        //根据属性名获取属性类型
        Field field = clazz.getDeclaredField("age");
        Method setAgeMethod = clazz.getDeclaredMethod(setMethodName, field.getType());
        Object o = clazz.newInstance();
        //给属性赋值
        setAgeMethod.invoke(o, 23);
        System.out.println(o);
    }
}

执行结果:
在这里插入图片描述


你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:spring之反射机制之Spring-DI核心实现-创新互联
文章出自:http://cdiso.cn/article/jpegg.html

其他资讯