反射机制在动态生成类并访问该类数据中的应用
程序员文章站
2022-07-10 22:35:23
...
前提:
本文将介绍在动态加载不确定类的方法,并且*访问不确定的类的数据
高级:
当你获得到某个类的对象们时,对象的属性值为类对象的只能获得ID而不能获取到其他值,
这时获得的属性对象是个代理类的对象,如要获取真正的属性对象,我们要通过hibernate执行查询语句。
开始啦:
根据String型的名称,动态生成类:
获取动态生成的类的对象:
访问动态生成的类的属性:
根据属性名获得某类对象的属性:
此处的特点为要获取的属性名可能是这个类的基类中的私有属性
获得未知类的set型属性值(即泛型)对应的具体类名:
***************************世界末日前也得格叽格叽*********************************
对事业:勿忘初衷
对XXX:有些人,一旦遇见,便一眼万年;有些心动,一旦开始,便覆水难收。
本文将介绍在动态加载不确定类的方法,并且*访问不确定的类的数据
高级:
当你获得到某个类的对象们时,对象的属性值为类对象的只能获得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:有些人,一旦遇见,便一眼万年;有些心动,一旦开始,便覆水难收。