java - Java - 反射。在 setter 方法中设置 Value 动态创建的多参数类对象
问题描述
我有一个 Bean 类用户,我在运行时动态创建对象。我可以在 setter 方法中设置值,但该 setter 方法有多个参数。
这是我的用户 Bean 类
public class User {
private String name1;
private String name2;
private String name3;
private int age1;
private int age2;
public String getName1() {
return name1;
}
public void setName1(String name1,String name2,String name3) {
this.name1 = name1;
this.name2 = name2;
this.name3 = name3;
}
public int getAge1() {
return age1;
}
public void setAge1(int age1,int age2) {
this.age1 = age1;
this.age2 = age2;
}
@Override
public String toString() {
return "StudentUser [name1=" + name1 + ", name2=" + name2 + ", name3=" + name3 + ", age1=" + age1 + ", age2="
+ age2 + "]";
}
我想使用反射调用这个setter方法。我可以在运行时找到任何东西,比如方法名称方法参数类型,并且还有参数类型的顺序。
对于我的情况,我有一些 setter 方法的默认值,例如原始类型和非原始类型,并在运行时找到方法参数类型并调用 setter 方法并为它们设置默认值
我的主要方法:-
public static Object getBean(String beanClassName) throws Exception
{
Class klass = Class.forName(beanClassName); //->Get Class Name By Path
Object obj = klass.newInstance(); //->Create The Object of Class
Method[] b = klass.getDeclaredMethods(); //->Get Declared Method in Class
for(Method m : b)
{
Type[] pType = m.getGenericParameterTypes();
for(int i=0;i<pType.length; i++)
{
System.out.println("The Arguments :"+pType[i]+" Arguments Order :"+i);
if(pType[i].equals(String.class))
{
m.setAccessible(true);
m.invoke(obj,"Hello");
}
else if(pType[i].equals(int.class))
{
System.out.println("Machted int");
m.setAccessible(true);
m.invoke(obj,21);
}
}
}
return obj;
}
我可以做到这一点,我有执行 ArgumentMissMacth。我想将每个字符串类型设置为“Hello”,将每个 Int 类型设置为 23,并将对象设置为 Null 如何动态识别要设置的顺序。
我的情况我会知道方法参数类型,但必须根据方法参数类型设置默认值。
解决方案
方法需要 3 个参数,但您调用的方法只有 1 个参数。您应该收集所有参数值然后调用方法。
这是示例代码。
public static Object getBean(String beanClassName) throws Exception {
Class klass = Class.forName(beanClassName); // ->Get Class Name By Path
Object obj = klass.newInstance(); // ->Create The Object of Class
Method[] b = klass.getDeclaredMethods(); // ->Get Declared Method in
// Class
for (Method m : b) {
Type[] pType = m.getGenericParameterTypes();
if(pType.length==0){
continue;
}
/**
* Create new array to hold value of parameters
*/
Object[] params = new Object[pType.length];
for (int i = 0; i < pType.length; i++) {
System.out.println("The Arguments :" + pType[i] + " Arguments Order :" + i);
if (pType[i].equals(String.class)) {
params[i] = "Hello";
} else if (pType[i].equals(int.class)) {
params[i] = 21;
}
}
m.setAccessible(true);
/**
* Invoke method with all paramtters.
*/
m.invoke(obj, params);
}
return obj;
}
推荐阅读
- rust - 无法打开创世配置文件
- c# - Unity IOException:在 output_log.txt 的路径上共享冲突,如何读取正在使用的文件?
- python - 使模型的第一个实例在 SQLAlchemy 中具有唯一字段
- swift - SWIFTUI Firebase 检索子集合数据
- qt - 是否在 deleteLater() 之前调用了所有 Qt 插槽?
- c - 在 GDB 中使用便利变量的地址
- java - 尝试保存图像时出现 Android 运行时错误
- java - 有谁知道如何自动在手机屏幕上找到坏点?
- arrays - 检测 shell 脚本中的 ksh 数组支持
- javascript - 如何在 Jest 中跟踪失败的异步测试?