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