Java--反射之获取对象信息

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

在学设计模式的时候,我们看到过一句话:“反射反射,程序员的快乐”,当时对这句话没有很深刻的认识,到学习了struts、spring等之后,感觉到反射真是很强大的存在。

我们今天介绍如何通过java的反射,获取对象的信息。需求是这样的:有一个实体,实体里面有多个属性,通过这个实体中有值的属性做检索条件,就是如果某一个属性有值,那么这个属性就是一个检索条件,如果某一个属性没有值,那么这个属性就不作为检索条件。这样一个方法比较通过,而且在很大的程度上提高了代码的复用型,那么我们如果通过一个实体拿到其所有的属性呢?答案是——反射!

	 public List queryByEntity(Object model,String cont) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
	     Map<Serializable, Serializable> map=new HashMap<Serializable, Serializable>();
		 Field[] field = model.getClass().getDeclaredFields();        //获取实体类的所有属性,返回Field数组
	        for(int j=0 ; j<field.length ; j++){     //遍历所有属性
	                String name = field[j].getName();    //获取属性的名字
	                System.out.println("属性名:"+name);
	                String anotherName=name;
	                name = name.substring(0,1).toUpperCase()+name.substring(1); //将属性的首字符大写,方便构造get,set方法
	                String type = field[j].getGenericType().toString();    //获取属性的类型
	                if(type.equals("class java.lang.String")){   //如果type是类类型,则前面包含"class ",后面跟类名
	                    Method m = model.getClass().getMethod("get"+name);
	                    String value = (String) m.invoke(model);    //调用getter方法获取属性值
	                    if(value != null){
	                    	//把属性名和值放入map中;
	    	                map.put(anotherName, value);

	                    }
	                }
	                if(type.equals("class java.lang.Integer")){
	                    Method m = model.getClass().getMethod("get"+name);
	                    Integer value = (Integer) m.invoke(model);
	                    if(value != null){
	                    	//把属性名和值放入map中;
	    	                map.put(anotherName, value);

	                    }
	                }
	                if(type.equals("class java.lang.Short")){
	                    Method m = model.getClass().getMethod("get"+name);
	                    Short value = (Short) m.invoke(model);
	                    if(value != null){
	                    	//把属性名和值放入map中;
	    	                map.put(anotherName, value);
	                    }
	                }
	                if(type.equals("class java.lang.Double")){
	                    Method m = model.getClass().getMethod("get"+name);
	                    Double value = (Double) m.invoke(model);
	                    if(value != null){
	                    	//把属性名和值放入map中;
	    	                map.put(anotherName, value);

	                    }
	                }
	                if(type.equals("class java.lang.Boolean")){
	                    Method m = model.getClass().getMethod("get"+name);
	                    Boolean value = (Boolean) m.invoke(model);
	                    if(value != null){
	                    	//把属性名和值放入map中;
	    	                map.put(anotherName, value);

	                    }
	                }
	                if(type.equals("class java.util.Date")){
	                    Method m = model.getClass().getMethod("get"+name);
	                    Date value = (Date) m.invoke(model);
	                    if(value != null){
	                    	//把属性名和值放入map中;
	    	                map.put(anotherName, value);

	                    }
	                }
	            }
}

通过这些代码,我们已经能获取到该实体中,所有不为null的属性,并且将之存在了map中。获取到这些之后,我们就可以很方便的做检索。

总结:

Java的反射不仅仅体现在这一点上,java的反射还在很多地方发挥着及其重要的作用,因为反射,我们可以提高系统的灵活性。如struts中,请求的派发控制。当请求来到时,struts通过查询配置文件,找到该请求对应的action,然后通过反射实例化action,并调用响应method。如果不适用反射,那么就只能写死到代码里了。

时间: 2024-08-09 22:02:55

Java--反射之获取对象信息的相关文章

java 反射机制-获取对应class信息

1 package reflection; 2 3 public class User { 4 public String name; 5 protected int age; 6 String address; 7 private String sex; 8 9 public User() { 10 super(); 11 } 12 13 public User(String name, int age, String sex) { 14 super(); 15 this.name = nam

反射之获取方法信息

本文接上文"反射之Class类的使用",以编写一个用来获取类的信息(成员函数.成员变量)的工具类来讲解"反射之获取方法信息" 1.新建工具类,命名ClassUtil,输入一个对象(Object),输出该对象的基础信息方法(printClassMessage) 1 /** 2 * 打印类的信息,成员函数.成员变量 3 * Created by Format on 2017/6/3. 4 */ 5 public class ClassUtil { 6 7 } 2.获取类

利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 package com.banksteel.util; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Arrays;import java.ut

python 获取对象信息

当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> type(123) <type 'int'> >>> type('str') <type 'str'> >>> type(None) <type 'NoneType'> 如果一个变量指向函数或者类,也可以用type()判断: >&

python 之获取对象信息

当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: >>> type(123) <class 'int'> >>> type('str') <class 'str'> >>> type(None) <type(None) 'NoneType'> 如果一个变量指向函数或者类,也可以用type()判

Python 面向对象编程——获取对象信息

1.1   获取对象信息 1.1.1   使用type()判断对象类型 >>> type(123)    --基本数据类型判断 <class 'int'> >>> type('123') <class 'str'> >>> type(abs)    --python内置函数的判断 <class 'builtin_function_or_method'> >>> type(Dog) <class

【Python】[面性对象编程] 获取对象信息,实例属性和类属性

获取对象信息1.使用isinstance()判断class类型2.dir() 返回一个对象的所有属性和方法3.如果试图获取不存在的对象会抛出异常[AttributeError]4.正确利用对象内置函数的例子: def readImage(fp): if hasattr(fp,"read"): return readData(fp) return None 实例属性和类属性1.一句话,Python是动态语言,根据类创建的实例可以任意绑定属性.    注意:实例属性和雷属性的名字要保持不一

python获取对象信息

获取对象信息 拿到一个变量,除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢? 例如,已有定义: class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class Student(Person): def __init__(self, name, gender, score): super(Student, sel

面向对象编程——获取对象信息(五)

当我们拿到一个对象的引用时,如何知道这个对象是什么类型.有哪些方法呢? 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()类型: >>> type(123) <class 'int'> >>> type('str') <class 'str'> >>> type(None) <class 'NoneType'> 如果一个变量指向函数或者类,也可以用type()判断: &g