1.注解类
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)//注解运行范围
@Target(ElementType.FIELD)
//@Inherited
//@Documented
public @interface AutoWared {
}
2.Controller
public class UserController {
@AutoWared
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
3.Service
public class UserService {
public UserService(){
System.out.println("UserService construct.....");
}
}
4.Test,两种反射都可以创建注入对象,第二种明显优于第一种
public static void test() throws Exception {
UserController userController = new UserController();
Class<? extends UserController> aClazz = userController.getClass();
UserService u = new UserService();
Field userService = aClazz.getDeclaredField("userService");
userService.setAccessible(true);
//只有通过方法才能设置具体属性
String name = userService.getName();
name = name.substring(0,1).toUpperCase()+name.substring(1,name.length());
String setMName = "set"+name;
Method m = aClazz.getMethod(setMName,UserService.class);
m.invoke(userController,u);
System.out.println(userController.getUserService());
}
public static void test2() throws Exception {
UserController userController = new UserController();
Class<? extends UserController> aClazz = userController.getClass();
Stream.of(aClazz.getDeclaredFields()).forEach(field -> {
String name = field.getName();
AutoWared annotation = field.getAnnotation(AutoWared.class);
field.setAccessible(true);
if(annotation!=null){
Class<?> type = field.getType();
try {
Object o = type.newInstance();
field.set(userController,o);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
System.out.println(userController.getUserService());
}