@Autowired 如何使用反射工作以及如何调用适当的 Setter 方法
How @Autowired Work using Reflection and how invoke appropriate Setter Method
我的主要问题是我可以使用反射 API 并且我可以在我的用户 bean 中调用 setter 方法 class.But 我只有 UserBean 对象。我不知道哪个 setter 方法 invoke.i 想要提取我的用户 bean 对象中的所有信息并使用反射调用适当的方法。
//-->这是我的用户 Bean Class
public class User {
private String name;
private int age;
private String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
private int getAge() {
return age;
}
private void setAge(int age) {
this.age = age;
}
void callMethod() { System.out.println("Name :- "+name+" Age :-"+age); }
@Override
public String toString() { return "User [name=" + name + ", age=" + age + "]";}
}
//--->这是我的主要方法
public class TestCase {
public static Object getBean(String beanClassName) throws Exception
{
Class klass = Class.forName(beanClassName);
Object obj = klass.newInstance();
Method[] b = klass.getDeclaredMethods();
String MethodName1 = "setName";
String MethodName2 = "setAge";
String name ="sanket";
int age = 21;
for(int i=0;i<b.length;i++)
{
if(b[i].getParameterTypes().toString().equals(MethodName1))
{
b[i].setAccessible(true);
b[i].invoke(obj,name);
}
if(b[i].getName().equals(MethodName2))
{
b[i].setAccessible(true);
b[i].invoke(obj,age);
}
}
return obj;
}
public static void main(String ars[]) throws Exception
{
Object obj1 = getBean("www.Fouth.User");
System.out.println(obj1.toString());
}
}
在我的情况下,我可以手动调用 setter 方法,因为我可以调用方法名称的 setter 方法基础。
我想在用户 Bean Class 中提取信息,并根据要调用的值 setter 进行识别。
在 spring @AutoWired 中 that.How 他们将确定要调用哪个 setter 并注入依赖项。
Spring 通过找出哪些 setter 被注释为 @Autowired
、 @Inject
、 [=12 来识别哪些 setter 注入依赖关系=]等
然后它通过检查 setter 参数的类型来确定将哪个值注入 setter 并注入具有相同类型的 bean。
如果多个bean 具有相同的类型,则检查bean 名称。它将使用 @Qaulifer
或 @Resources
注入与在注入点中配置的名称相同的 bean。
如果还有多个bean满足注入,NoUniqueBeanDefinitionException
就会发生。
如果没有满足注入的bean,就会发生NoSuchBeanDefinitionException
。
我的主要问题是我可以使用反射 API 并且我可以在我的用户 bean 中调用 setter 方法 class.But 我只有 UserBean 对象。我不知道哪个 setter 方法 invoke.i 想要提取我的用户 bean 对象中的所有信息并使用反射调用适当的方法。
//-->这是我的用户 Bean Class
public class User {
private String name;
private int age;
private String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
private int getAge() {
return age;
}
private void setAge(int age) {
this.age = age;
}
void callMethod() { System.out.println("Name :- "+name+" Age :-"+age); }
@Override
public String toString() { return "User [name=" + name + ", age=" + age + "]";}
}
//--->这是我的主要方法
public class TestCase {
public static Object getBean(String beanClassName) throws Exception
{
Class klass = Class.forName(beanClassName);
Object obj = klass.newInstance();
Method[] b = klass.getDeclaredMethods();
String MethodName1 = "setName";
String MethodName2 = "setAge";
String name ="sanket";
int age = 21;
for(int i=0;i<b.length;i++)
{
if(b[i].getParameterTypes().toString().equals(MethodName1))
{
b[i].setAccessible(true);
b[i].invoke(obj,name);
}
if(b[i].getName().equals(MethodName2))
{
b[i].setAccessible(true);
b[i].invoke(obj,age);
}
}
return obj;
}
public static void main(String ars[]) throws Exception
{
Object obj1 = getBean("www.Fouth.User");
System.out.println(obj1.toString());
}
}
在我的情况下,我可以手动调用 setter 方法,因为我可以调用方法名称的 setter 方法基础。
我想在用户 Bean Class 中提取信息,并根据要调用的值 setter 进行识别。
在 spring @AutoWired 中 that.How 他们将确定要调用哪个 setter 并注入依赖项。
Spring 通过找出哪些 setter 被注释为 @Autowired
、 @Inject
、 [=12 来识别哪些 setter 注入依赖关系=]等
然后它通过检查 setter 参数的类型来确定将哪个值注入 setter 并注入具有相同类型的 bean。
如果多个bean 具有相同的类型,则检查bean 名称。它将使用 @Qaulifer
或 @Resources
注入与在注入点中配置的名称相同的 bean。
如果还有多个bean满足注入,NoUniqueBeanDefinitionException
就会发生。
如果没有满足注入的bean,就会发生NoSuchBeanDefinitionException
。