//哪个子类调的这个方法,得到的class就是子类处理的类型(非常重要)
//
public BaseDao(){
Class clazz = this.getClass(); //拿到的是子类 这里非常的重要
ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass(); //BaseDao<Category> //反射范型
clazz = (Class) pt.getActualTypeArguments()[0];
System.out.println(clazz);
}
//如何通过注解来为person注入一个对象
//1.得到需要注入的属性
Field f = PersonDao.class.getDeclaredField("person");
//2.得到属性需要的 类型
Class clazz = f.getType();
//3.创建person
Person person = (Person) clazz.newInstance();
//4.反射属性的注解,
InjectPerson inject = f.getAnnotation(InjectPerson.class);
//5.并用注解的信息填充person
Method ms [] = inject.getClass().getMethods();
for(Method m : ms){
String methodName = m.getName(); //name( ) age()
//看person对象上有没有注解与之对应的属性
try{
Field f = Person.class.getDeclaredField(methodName);
f.setAccessible(true);
f.set(person,m.invoke(inject, null))
PropertyDescriptor pd = new PropertyDescriptor(methodName,Person.class);
Method set = pd.getWriteMethod(); //setname setage
set.invoke(person, m.invoke(inject, null));
}catch (Exception e) {
continue;
}
}
//6.把person赋给dao
PersonDao dao = new PersonDao();
f.setAccessible(true); //person
f.set(dao, person);
//这里是反射方法上面的代码
//1.得到要注入的属性
PropertyDescriptor pd = new PropertyDescriptor("person",PersonDao.class);
//2.得到要注入的属性需要的类型
Class clazz = pd.getPropertyType(); //Person
//3.创健属性需要的对象
Object person = clazz.newInstance();
//4.得到属性的写方法
Method setPerosn = pd.getWriteMethod();
//5.反射出方法上声明的注解
InjectPerson inject = setPerosn.getAnnotation(InjectPerson.class);
//6.得到注解上声明的信息,填充person对象
Method[] methods = inject.getClass().getMethods();
for(Method m : methods){
String methodName = m.getName(); //name or age
try{
Field f = Person.class.getDeclaredField(methodName);
Object value = m.invoke(inject, null); //得到注解上配置的属性的值
f.setAccessible(true);
f.set(person, value);
}catch (Exception e) {
continue;
}
}
//7.把填充了数据的person通过setPerson方法整到personDao对象上
PersonDao dao = new PersonDao();
setPerosn.invoke(dao, person);
System.out.println(dao.getPerson().getName());
//
public BaseDao(){
Class clazz = this.getClass(); //拿到的是子类 这里非常的重要
ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass(); //BaseDao<Category> //反射范型
clazz = (Class) pt.getActualTypeArguments()[0];
System.out.println(clazz);
}
//如何通过注解来为person注入一个对象
//1.得到需要注入的属性
Field f = PersonDao.class.getDeclaredField("person");
//2.得到属性需要的 类型
Class clazz = f.getType();
//3.创建person
Person person = (Person) clazz.newInstance();
//4.反射属性的注解,
InjectPerson inject = f.getAnnotation(InjectPerson.class);
//5.并用注解的信息填充person
Method ms [] = inject.getClass().getMethods();
for(Method m : ms){
String methodName = m.getName(); //name( ) age()
//看person对象上有没有注解与之对应的属性
try{
Field f = Person.class.getDeclaredField(methodName);
f.setAccessible(true);
f.set(person,m.invoke(inject, null))
PropertyDescriptor pd = new PropertyDescriptor(methodName,Person.class);
Method set = pd.getWriteMethod(); //setname setage
set.invoke(person, m.invoke(inject, null));
}catch (Exception e) {
continue;
}
}
//6.把person赋给dao
PersonDao dao = new PersonDao();
f.setAccessible(true); //person
f.set(dao, person);
//这里是反射方法上面的代码
//1.得到要注入的属性
PropertyDescriptor pd = new PropertyDescriptor("person",PersonDao.class);
//2.得到要注入的属性需要的类型
Class clazz = pd.getPropertyType(); //Person
//3.创健属性需要的对象
Object person = clazz.newInstance();
//4.得到属性的写方法
Method setPerosn = pd.getWriteMethod();
//5.反射出方法上声明的注解
InjectPerson inject = setPerosn.getAnnotation(InjectPerson.class);
//6.得到注解上声明的信息,填充person对象
Method[] methods = inject.getClass().getMethods();
for(Method m : methods){
String methodName = m.getName(); //name or age
try{
Field f = Person.class.getDeclaredField(methodName);
Object value = m.invoke(inject, null); //得到注解上配置的属性的值
f.setAccessible(true);
f.set(person, value);
}catch (Exception e) {
continue;
}
}
//7.把填充了数据的person通过setPerson方法整到personDao对象上
PersonDao dao = new PersonDao();
setPerosn.invoke(dao, person);
System.out.println(dao.getPerson().getName());