反射机制在动态生成类并访问该类数据中的应用

前提:
本文将介绍在动态加载不确定类的方法,并且自由访问不确定的类的数据
高级:
当你获得到某个类的对象们时,对象的属性值为类对象的只能获得ID而不能获取到其他值,
这时获得的属性对象是个代理类的对象,如要获取真正的属性对象,我们要通过hibernate执行查询语句。
开始啦:
根据String型的名称,动态生成类:

/**
* @return 返回导出对象对应的类
* @throws Exception
* 抛出异常
*/
public Object get(String className) throws Exception {
Class<?> clz = Class.forName(className);
Object obj = clz.newInstance();
return obj;
}

获取动态生成的类的对象:

/**
* @param obj 要转换的对象 这个对象此时是代理类
* @param session hibernate的session
*
*/
public Object ObjectByClassName(Object obj,Session session){
obj = (Object)((SessionImpl)session).immediateLoad(fieldName,session.getIdentifier(obj));
//通过session查询语句,得到一个完整的对象
return obj;
}

访问动态生成的类的属性:

/**
*
* @param obj 动态获取的对象
* @param fieldName 该对象的类
*
* @return 导出对象中分类条件字段值
*/
private Object getProperty(Object obj,String fieldName) {
Object value = null;
Field property;
try {
Class<?> conClass = obj.getClass();
property = conClass.getDeclaredField(fieldName);
property.setAccessible(true); //如果要访问的属性是私有的,那么此句很必要,你懂的!
try {
value=property.get(obj);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}catch(ClassNotFoundException e){
e.printStackTrace();
}
return value;
}

根据属性名获得某类对象的属性:
此处的特点为要获取的属性名可能是这个类的基类中的私有属性

/**
* @obj 对象
* @fieldName 属性名称
* @return 返回分类字段值的name属性的Field
* @throws Exception
*/
public Object getFieldObject(Object obj,String fieldName){
Class<?> conClass = obj.getClass();
try {
Field[] conField = conClass.getDeclaredFields();
int row = 10;//防止找不到此名称的属性造成无限循环
while(row>0){
for(int i=0;i<conField.length;i++){
Field field = conField[i];
field.setAccessible(true);
if(field.getName().equals(fieldName)){
try {
return field.get(obj);
} catch (IllegalArgumentException e) {
return "";
} catch (IllegalAccessException e) {
return "";
}
}
}
conClass =conClass.getSuperclass();
conField = conClass.getDeclaredFields();
row--;
}
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());

return "";
}
return "";
}
}

获得未知类的set型属性值(即泛型)对应的具体类名:

//property是已获得的一个泛型的属性值
if (property.getClass().getName().endsWith(this.SET_TYPE)) {
PersistentSet sets = (PersistentSet)property;
Iterator<?> itSet = sets.iterator();
while(itSet.hasNext()){
Object it = itSet.next();//在这里hibernate执行了查询语句,得到了一个完整的对象
String setClassName = it.getClass();
}
}

***************************世界末日前也得格叽格叽*********************************
对事业:勿忘初衷
对XXX:有些人,一旦遇见,便一眼万年;有些心动,一旦开始,便覆水难收。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值