当前位置: 首页 > 图灵资讯 > 技术篇> 回顾反射机制

回顾反射机制

来源:图灵教育
时间:2023-06-08 09:22:27

1.分析方法四要素59

*第一要素:调用哪个对象

*第二个要素:调用哪种方法

*第三个要素:调用方法时传输哪些参数?

*第四要素:方法实施后的返回结果

*调用哪个对象,传输哪个参数,返回哪个值。

*即使使用反射机制调用方法,也需要具备这四个要素。

让我们来看看需要多个元素的参与,而不使用反射机制来调用一种方法。

有一个这样的类:

package com.powernode.reflect;/** * 回顾反射机制  59 **/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 com.powernode.reflect;//回顾反射机制  59public class Test {    public static void main(String[] args) {        // 不使用反射机制来调用这些方法        SomeService someService = new SomeService();        someService.doSome();        /**         * 分析:调用一种方法,它含有多少元素?四要素。四要素。         * 第一要素:调用哪个对象         * 第二个要素:调用哪种方法         * 第三个要素:调用方法时传输哪些参数?         * 第四要素:方法实施后的返回结果         *         * 调用哪个对象,传输哪个参数,返回哪个值。         *         * 即使使用反射机制调用方法,也需要具备这四个要素。         */        String s1 = someService.doSome(张三);        System.out.println(s1);        String s2 = someService.doSome(李四), 250);        System.out.println(s2);    }}

回顾反射机制_调用方法

2.反射步骤602.1获得Method

要获得Method的方法,首先需要获得这类Classs

Class<?> clazz=Class.forName("com.powernode.reflect.SomeService");

获得Class后,可以通过调用getdeclaredMethod()获得方法。

假如你想得到这个方法:doSome(Strings,inti)

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

要得到一种方法,你需要告诉Java程序,你想要得到的方法的名称是什么,以及每个形参的类型是什么。这样,Java程序就可以给你相应的方法。

这种设计也很合理,因为在同一类中,方法支持重载,即方法名可以相同,但参数列表必须不同,因此需要提供方法名和每个形状参的类型才能获得一种方法。

2.2.调用Method6000

如果要调用一种方法,则与四个要素有关:

●调用哪个对象

●哪个方法

●传什么参数

●返回什么值

第一步:创建对象(四要素之首:调用哪个对象)

 Class<?> clazz = Class.forName("com.powernode.reflect.SomeService");Object obj = clazz.newInstance();

第二步:获取方法

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

第三步:调用方法

Object retValue = doSomeMethod.invoke(obj, "李四", 250);

四要素:调用哪个对象,哪个方法,传输哪个参数,返回哪个值。

obj元素:哪个对象

dosomemethod元素:哪种方法

“李四”,250元素:传递什么参数?

retvalue元素:返回什么值?

2.3演示调用dosome(Strings,inti)

package com.powernode.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Method;///使用反射机制调用方法  60public class Test2 {    public static void main(String[] args) throws Exception{        // 如何使用反射机制调用方法。        // 获取类        Class<?> clazz = Class.forName("com.powernode.reflect.SomeService");        // 获取方法        Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);        // 调用方法        // 四要素:调用哪个对象,哪个方法,传输哪个参数,返回哪个值。        // obj 要素:哪个对象        // doSomeMethod 要素:哪种方法        // "李四", 250 要素:传输哪些参数        // retValue 要素:返回什么值。        ///因为我们的clazzz.newInstance()方法已过时,        // 也可以采用先获调用无参数结构的方法,然后调用newinstance()方法///        Constructor<?> con = clazz.getDeclaredConstructor();//        Object o = con.newInstance();        //过时也没关系,不影响使用        Object obj = clazz.newInstance();        Object retValue = doSomeMethod.invoke(obj, "李四", 250);        System.out.println(retValue);    }}

回顾反射机制_User_02

2.4演示调用dosome()

package com.powernode.reflect;import java.lang.reflect.Method;/** * 使用反射机调用方法  60 **/public class Test3 {    public static void main(String[] args) throws Exception{        // 获取类        Class<?> clazz = Class.forName("com.powernode.reflect.SomeService");        // 获取方法        Method doSomeMethod = clazz.getDeclaredMethod("doSome");        // 调用方法        ///创建对象        Object obj = clazz.newInstance();        doSomeMethod.invoke(obj);    }}

回顾反射机制_User_03

3.61SpringDI的核心实现3.1需求:61

假设您现在已知以下信息:

1.有这样一个类,叫做:com.powernode.reflect.User

2.这一类符合javabean规范。属性私有化,提供开放的setter和getter方法。

3.你也知道这个类别中有一个属性,属性的名字叫age

4.你也知道age属性的类型是int类型。

请使用反射机制调用set法赋值User对象的age属性。

package com.powernode.reflect;/** * SpringDI的核心实现  61 **/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 +                '}';    }}

package com.powernode.reflect;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * SpringDI的核心实现  61 **/public class Test4 {    public static void main(String[] args) throws Exception {        /*        需求:            假设您现在已知以下信息:                1. 有这样一个类,类名叫做:com.powernode.reflect.User                2. 这一类符合javabean规范。属性私有化,为外界提供开放的setter和getter方法。属性私有化,为外界提供开放的setter和getter方法。                3. 你也知道这个类别中有一个属性,属性的名称叫做 age                4. 而且你也知道age属性的类型是int类型。            请使用反射机制调用set法赋值User对象的age属性。         */        String className = "com.powernode.reflect.User";        String propertyName = "age";        // 通过反射机制调用setagee(int)方法        // 获取类        Class<?> clazz = Class.forName(className);        // 获取方法名        String setMethodName = "set" + propertyName.toUpperCase().charAt(0) + propertyName.substring(1);        // 根据属性名获取属性类型        Field field = clazz.getDeclaredField(propertyName);        // 获取方法        Method setMethod = clazz.getDeclaredMethod(setMethodName, field.getType());        // 准备对象        Object obj = clazz.newInstance();        // 调用方法        setMethod.invoke(obj, 30);        System.out.println(obj);    }}

回顾反射机制_调用方法_04