一、分析方法四要素
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);}
}
运行结果:
一 叶 知 秋,奥 妙 玄 心