欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-10 22:22:57
...
前提:
本文将介绍在动态加载不确定类的方法,并且*访问不确定的类的数据
高级:
当你获得到某个类的对象们时,对象的属性值为类对象的只能获得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:有些人,一旦遇见,便一眼万年;有些心动,一旦开始,便覆水难收。
相关标签: java hibernate