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