目录
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;}@Overridepublic 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.User2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法3、你还知道这个类当中有一个属性,属性名叫:age4、并且你还知道age的属性类型为int类型请用反射机制调用相关方法,给user对象的age属性赋值*/String className="com.dong.reflect.User";String propertyName="age";//通过反射机制调用setAge(int)方法//获取类Class<?> clazz = Class.forName(className);//获取方法//先根据属性名获取方法名// [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAgeString 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.User2、这个类符合JavaBean规范。属性私有化,对外提供公开的setter和getter方法3、你还知道这个类当中有一个属性,属性名叫:age4、并且你还知道age的属性类型为int类型请用反射机制调用相关方法,给user对象的age属性赋值*/String className="com.dong.reflect.User";String propertyName="age";//通过反射机制调用setAge(int)方法//获取类Class<?> clazz = Class.forName(className);//获取方法//先根据属性名获取方法名// [拼凑:set+属性先全部大写然后取第一个字母,即A+获取属性从第二个字母开始的全部字母,即:ge]=setAgeString 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);}
}
-
运行结果