目录
10.回顾反射机制
10.1 分析方法四要素
//不使用反射机制调用这些方法
使用反射机制调用方法
代码:
运行结果:
10.4 假设你知道属性名
测试代码
运行结果
10.回顾反射机制
10.1 分析方法四要素
package com.dong.reflect;
public class SomeService {
public void doSome(){
System.out.println("public void doSome() 执行!!");
}
public String doSome(String s){
System.out.println("public String doSome() 执行!!");
return s;
}
public String doSome(String s,int i){
System.out.println(" public String doSome(String s,int i) 执行!!");
return s+i;
}
}
-
//不使用反射机制调用这些方法
package com.dong.reflect;
public class Test {
public static void main(String[] args) {
//不使用反射机制调用这些方法
SomeService someService=new SomeService();
someService.doSome();
/**
* 调用一个方法,一般涉及到4个要素:
* ● 调用哪个对象的(someService)
* ● 哪个方法(doSome)
* ● 传什么参数(**)
* ● 返回什么值(*)
* 总结:调用哪个对象的哪个方法、传什么参数、返回什么值。
*
* 即使使用反射机制调用方法,也需要具备上述4个要素
*/
String s1 = someService.doSome("张三");
System.out.println(s1);
String s2 = someService.doSome("李四", 180);
System.out.println(s2);
}
}
/**
* 调用一个方法,一般涉及到4个要素:
* ● 调用哪个对象的(someService)
* ● 哪个方法(doSome)
* ● 传什么参数(**)
* ● 返回什么值(*)
* 总结:调用哪个对象的哪个方法、传什么参数、返回什么值。
*
* 即使使用反射机制调用方法,也需要具备上述4个要素
*/
-
使用反射机制调用方法
-
代码:
-
package com.dong.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test2 {
public static void main(String[] args) throws Exception {
//使用反射机制调用方法
//先获取类
Class<?> clazz = Class.forName("com.dong.reflect.SomeService");
//获取方法
Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);
//调用方法
//四要素:调用哪个对象、哪个方法、传什么参数、返回什么值。
// obj 要素:哪个对象
// doSomeMethod 要素:哪个方法
// "李四身高:", 180 要素:传什么参数
// retValue 要素:返回什么值
Object obj = clazz.newInstance();
/*
* 'newInstance()' 已弃用--->用以下方式创建对象:
* Constructor<?> con = clazz.getDeclaredConstructor();
* Object obj = con.newInstance();
*/
Object retValue = doSomeMethod.invoke(obj, "李四身高:", 180);
System.out.println(retValue);
}
}
-
-
运行结果:
-
- 小练习
- 代码
package com.dong.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test3 {
public static void main(String[] args) throws Exception{
//测试 用反射机制调用doSome()没有参数的方法
//获取类
Class<?> clazz = Class.forName("com.dong.reflect.SomeService");
//获取方法
Method doSomeMethod = clazz.getDeclaredMethod("doSome");
//调用方法
Constructor<?> con = clazz.getDeclaredConstructor();
Object obj = con.newInstance();
doSomeMethod.invoke(obj);
}
}
- 运行结果
10.4 假设你知道属性名
假设有这样一个类:
package com.dong.reflect;
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 +
'}';
}
}
你知道以下这几条信息:
- 类名是:com.powernode.reflect.User
- 该类中有String类型的name属性和int类型的age属性。
- 另外你也知道该类的设计符合javabean规范。(也就是说属性私有化,对外提供setter和getter方法)
你如何通过反射机制给User对象的name属性赋值zhangsan,给age属性赋值30岁。
-
测试代码
v-1.0
package com.dong.reflect;
import java.lang.reflect.Method;
public class Test4 {
public static void main(String[] args) throws Exception{
/*
需求:
假设你现在知道一下信息:
1、有这样一个类:类名叫:com.dong.reflect.User
2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法
3、你还知道这个类当中有一个属性,属性名叫:age
4、并且你还知道age的属性类型为int类型
请用反射机制调用相关方法,给user对象的age属性赋值
*/
String className="com.dong.reflect.User";
String propertyName="age";
//通过反射机制调用setAge(int)方法
//获取类
Class<?> clazz = Class.forName(className);
//获取方法
//先根据属性名获取方法名
// [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAge
String setMethodName="set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);
Method setMethod = clazz.getDeclaredMethod(setMethodName, int.class);
//调用方法
Object obj = clazz.newInstance();
setMethod.invoke(obj, 30);
System.out.println(obj);
}
}
v-2.0 让属性类型动态获取---根据属性名获取属性类型
//根据属性名获取属性类型---clazzField 是一个 Field 对象,它代表了 clazz 类中的名为 propertyName 的属性 Field clazzField = clazz.getDeclaredField(propertyName); //这段代码是通过反射机制获取一个类(clazz)中指定属性(propertyName)的Field对象(clazzField)。它使用了Java中的getDeclaredField方法,该方法可以获取类中声明的所有字段,包括私有字段。通过这段代码,可以动态地获取和操作类中的属性。 Method setMethod = clazz.getDeclaredMethod(setMethodName,clazzField.getType());
package com.dong.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test4 {
public static void main(String[] args) throws Exception{
/*
需求:
假设你现在知道一下信息:
1、有这样一个类:类名叫:com.dong.reflect.User
2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法
3、你还知道这个类当中有一个属性,属性名叫:age
4、并且你还知道age的属性类型为int类型
请用反射机制调用相关方法,给user对象的age属性赋值
*/
String className="com.dong.reflect.User";
String propertyName="age";
//通过反射机制调用setAge(int)方法
//获取类
Class<?> clazz = Class.forName(className);
//获取方法
//先根据属性名获取方法名
// [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAge
String setMethodName="set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);
//根据属性名获取属性类型
Field clazzField = clazz.getDeclaredField(propertyName);
Method setMethod = clazz.getDeclaredMethod(setMethodName,clazzField.getType());
//调用方法
Object obj = clazz.newInstance();
setMethod.invoke(obj, 30);
System.out.println(obj);
}
}
-
运行结果