java 中 父类写初始化代码 反射获取类中的所有属性 并按照某种逻辑赋值(我是为了初始化Spring中的Bean)
父类是这样的publicclassBeans{publicstaticfinalintisInit=newObject(){publicStringgeOutCalssN...
父类是这样的
public class Beans {
public static final int isInit = new Object(){
public String geOutCalssName(){
String className = this.getClass().getName();
return className.substring(0, className.lastIndexOf('$'));
}
public int init(){
System.out.println(this.geOutCalssName());
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
if(wac!=null){
Class<?> thisClass = null;
Object thisObj = null;
try {
thisClass=Class.forName(this.geOutCalssName());
System.out.println(thisClass);
} catch (ClassNotFoundException e) {
System.out.println("或者当前类Class时出错!");
}
try {
thisObj = thisClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Field [] fields = thisClass.getDeclaredFields();
for (Field field : fields) {
//私有属性 拦截
if(field.getModifiers()==10) continue;
try {
Object bean = wac.getBean(field.getName());
if(bean!=null)
field.set(thisObj, new ScaleNettingDaoImpl() );
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return 1;
}
}.init();
}
子类这样的
public ABean extends Beans {
public static ScaleNettingDaoImpl scaleNettingDaoImpl;
}
我本来以为子类会继承父类中的 isInit
加载子类的时候 会自动通过反射给scaleNettingDaoImpl 赋值
事实证明 我想的多了 所谓的继承并不是把父类的属性或方法cope了一份,
而是保留了指向父类的属性或方法的引用
我原先的想法是这样的 小明的父亲有大鼻子的基因 小明也有大鼻子的基因 小明继承了(复制了)父亲大鼻子的基因
但是实际情况似乎是这样的 小明的父亲在小明出生前有一套大房子 小明的父亲给了小明对这套大房子的使用权 但这套房子 归根结底 还是小明父亲的,而且是在小明出生前就已经有了
所以我想请问两个问题
1.我上述的比喻是否正确,理解是否到位了
2.怎么才能实现一个父类 任何子类只要继承它 子类中只需要加几个属性 其他什么都不需要 就可以在加载子类的时候 自动给这几个属性赋值(用于spring的bean注入) 注意 只需要两个类 一个父类 一个子类 子类只需要声明属性 其他什么都不要 可能是我异想天开了 如果真的有办法 请大神教教我 展开
public class Beans {
public static final int isInit = new Object(){
public String geOutCalssName(){
String className = this.getClass().getName();
return className.substring(0, className.lastIndexOf('$'));
}
public int init(){
System.out.println(this.geOutCalssName());
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
if(wac!=null){
Class<?> thisClass = null;
Object thisObj = null;
try {
thisClass=Class.forName(this.geOutCalssName());
System.out.println(thisClass);
} catch (ClassNotFoundException e) {
System.out.println("或者当前类Class时出错!");
}
try {
thisObj = thisClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Field [] fields = thisClass.getDeclaredFields();
for (Field field : fields) {
//私有属性 拦截
if(field.getModifiers()==10) continue;
try {
Object bean = wac.getBean(field.getName());
if(bean!=null)
field.set(thisObj, new ScaleNettingDaoImpl() );
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return 1;
}
}.init();
}
子类这样的
public ABean extends Beans {
public static ScaleNettingDaoImpl scaleNettingDaoImpl;
}
我本来以为子类会继承父类中的 isInit
加载子类的时候 会自动通过反射给scaleNettingDaoImpl 赋值
事实证明 我想的多了 所谓的继承并不是把父类的属性或方法cope了一份,
而是保留了指向父类的属性或方法的引用
我原先的想法是这样的 小明的父亲有大鼻子的基因 小明也有大鼻子的基因 小明继承了(复制了)父亲大鼻子的基因
但是实际情况似乎是这样的 小明的父亲在小明出生前有一套大房子 小明的父亲给了小明对这套大房子的使用权 但这套房子 归根结底 还是小明父亲的,而且是在小明出生前就已经有了
所以我想请问两个问题
1.我上述的比喻是否正确,理解是否到位了
2.怎么才能实现一个父类 任何子类只要继承它 子类中只需要加几个属性 其他什么都不需要 就可以在加载子类的时候 自动给这几个属性赋值(用于spring的bean注入) 注意 只需要两个类 一个父类 一个子类 子类只需要声明属性 其他什么都不要 可能是我异想天开了 如果真的有办法 请大神教教我 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询