package reflact;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestReflect {
public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
UserController userController = new UserController();
UserService userService = new UserService();
System.out.println(userService);
// 完成注入的功能
Class<? extends UserController> clazz = userController.getClass();
// 获取属性
Field serviceField = clazz.getDeclaredField("userService");
// 设置访问属性
serviceField.setAccessible(true);
// 获取对应的set方法
String name = serviceField.getName();
name = name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
String methodName = "set" + name;
Method method = clazz.getMethod(methodName, UserService.class);
// 调用method方法
method.invoke(userController, userService);
System.out.println(userController.getUserService());
}
}
class UserController{
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
class UserService{
}
package reflact;
import java.lang.annotation.*;
import java.util.stream.Stream;
public class TestReflection {
public static void main(String[] args) {
UtilController utilController = new UtilController();
// 获取class对象
Class<? extends UtilController> clazz = utilController.getClass();
Stream.of(clazz.getDeclaredFields()).forEach(field -> {
// 现获取属性是否有注解
Autowired annotation = field.getAnnotation(Autowired.class);
if (null != annotation){
field.setAccessible(true);
// 获取当前属性的类型,有了类型可以创建具体的对象
Class<?> type = field.getType();
// 创建对象
try {
Object o = type.newInstance();
field.set(utilController, o);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
System.out.println(utilController.getUtilService());
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Inherited
@Documented
@interface Autowired{
}
class UtilController{
@Autowired
private UtilService utilService;
public UtilService getUtilService() {
return utilService;
}
}
class UtilService{
}