【Spring】回顾反射机制
一、分析方法四要素
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); } }
运行结果:
通过以上代码可以看出,调用一个方法,一般涉及到 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); } }
运行结果:
三、假设你知道属性名
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); } }
运行结果:
一 叶 知 秋,奥 妙 玄 心
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。