`
lynnlysh
  • 浏览: 176085 次
  • 性别: Icon_minigender_2
  • 来自: 天津
社区版块
存档分类
最新评论

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

阅读更多
前提:
本文将介绍在动态加载不确定类的方法,并且自由访问不确定的类的数据
高级:
当你获得到某个类的对象们时,对象的属性值为类对象的只能获得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:有些人,一旦遇见,便一眼万年;有些心动,一旦开始,便覆水难收。
0
0
分享到:
评论
1 楼 xjt_job 2012-12-11  
[img][/img]
   

相关推荐

    JAVA_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    基于Java的XML解析与反射设计模式.doc

    java对通过网络下载的类具 有一个安全防范机制(类classloader),如分配不同的名字空间以防替代本地的同名类 、字节代码检查,并提供安全管理机制(类securitymanager)让java应用设置安全哨兵 。多元性,作为现下...

    asp.net知识库

    也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息...

    [Java参考文档].JDK_API 1.6

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    JavaAPI1.6中文chm文档 part1

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    Java 1.6 API 中文 New

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    java api最新7.0

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    动软.Net代码自动生成器(Codematic)

    Codematic 是一款为 C# 数据库程序员设计的自动代码生成器,Codematic 生成的代码基于基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。...

    JavaAPI中文chm文档 part2

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

    [Java参考文档]

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    JDK_1_6 API

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    java jdk-api-1.6 中文 chmd

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    JAVA面试题最全集

    描述反射机制的作用 62.如何读写一个文件? 63.在图形界面中,一个按钮如何处理鼠标点击事件? 64.在图形界面中,一个表格,如何实现编辑单元格时弹出下拉框? 65.如何加载图片? 66.什么是模态对话框? 67....

    Spring面试题

    当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的...

    ASP.NET图书馆B/S系统

    系统基础代码应用了PetShop系统设计中的反射机制和抽象工厂方法模式,生成的基础类库包括Model对象实体类,封装操作数据库的类和函数的程序集DBUtility,数据访问层的接口程序集IDAL,访问SQL Server数据库,实现...

    PHP和MySQL Web开发第4版pdf以及源码

    4.6.10 在智能表单中应用 4.7 用正则表达式查找子字符串 4.8 使用正则表达式分割字符串 4.9 比较字符串函数和正则表达式函数 4.10 进一步学习 4.11 下一章 第5章 代码重用与函数编写 5.1 代码重用的好处 ...

Global site tag (gtag.js) - Google Analytics