javajava 反射机制详解判断对象所有属性是否全部为空

4762人阅读
java(293)
import java.lang.reflect.A
import java.lang.reflect.F
import java.lang.reflect.M
import java.util.AbstractM
import java.util.ArrayL
import java.util.C
import java.util.HashM
import java.util.HashS
import java.util.H
import java.util.I
import java.util.L
import java.util.M
import java.util.S
* The TypeUtil class static methods for inspecting complex java types.
* The typeToString() method is used to dump the contents of a passed object
* of any type (or collection) to a String.
This can be very useful for debugging code that
* manipulates complex structures.
* @version $Revision : 1.2.6.4 $
* @项目名称 :ProtectSystem
* @文件名称 :TypeUtil.java
* @所在包 :cn.yws.activity.util
* @功能描述 :对象属性变量值查看工具,这个是从网上找的,便于像php一样,直接查看对象里面的属性值,而不用每次都单步调试 这里利用到了java的反射机制
* @创建日期 :
public class TypeUtil {
* Returns a string holding the contents of the passed object,
* @param scope
* @param parentObject
* @param visitedObjs
* @return String
@SuppressWarnings({ &rawtypes& })
private static String complexTypeToString(String scope,
Object parentObject, List visitedObjs) {
StringBuffer buffer = new StringBuffer(&&);
// Ok, now we need to reflect into the object and add its child
// nodes...
Class cl = parentObject.getClass();
while (cl != null) {
processFields(cl.getDeclaredFields(), scope, parentObject,
buffer, visitedObjs);
cl = cl.getSuperclass();
} catch (IllegalAccessException iae) {
buffer.append(iae.toString());
return (buffer.toString());
* Method processFields
* @param fields
* @param scope
* @param parentObject
* @param buffer
StringBuffer
* @param visitedObjs
* @throws IllegalAccessException
@SuppressWarnings({ &rawtypes& })
private static void processFields(Field[] fields, String scope,
Object parentObject, StringBuffer buffer, List visitedObjs)
throws IllegalAccessException {
for (int i = 0; i & fields. i++) {
// Disregard certain fields for IDL structures
if (fields[i].getName().equals(&__discriminator&)
|| fields[i].getName().equals(&__uninitialized&)) {
// This allows us to see non-public fields. We might need to deal
// with some
// SecurityManager issues here once it is outside of VAJ...
fields[i].setAccessible(true);
if (Modifier.isStatic(fields[i].getModifiers())) {
// Ignore all static members. The classes that this dehydrator
// meant to handle are simple data objects, so static members
// have no
// bearing....
buffer.append(typeToString(scope + &.& + fields[i].getName(),
fields[i].get(parentObject), visitedObjs));
* Method isCollectionType
* @param obj
* @return boolean
public static boolean isCollectionType(Object obj) {
return (obj.getClass().isArray() || (obj instanceof Collection)
|| (obj instanceof Hashtable) || (obj instanceof HashMap)
|| (obj instanceof HashSet) || (obj instanceof List) || (obj instanceof AbstractMap));
* Method isComplexType
* @param obj
* @return boolean
@SuppressWarnings(&rawtypes&)
public static boolean isComplexType(Object obj) {
if (obj instanceof Boolean || obj instanceof Short
|| obj instanceof Byte || obj instanceof Integer
|| obj instanceof Long || obj instanceof Float
|| obj instanceof Character || obj instanceof Double
|| obj instanceof String) {
Class objectClass = obj.getClass();
if (objectClass == boolean.class || objectClass == Boolean.class
|| objectClass == short.class || objectClass == Short.class
|| objectClass == byte.class || objectClass == Byte.class
|| objectClass == int.class || objectClass == Integer.class
|| objectClass == long.class || objectClass == Long.class
|| objectClass == float.class || objectClass == Float.class
|| objectClass == char.class
|| objectClass == Character.class
|| objectClass == double.class
|| objectClass == Double.class
|| objectClass == String.class) {
* Returns a string holding the contents of the passed object,
* @param scope
* @param obj
* @param visitedObjs
* @return String
@SuppressWarnings({
&rawtypes&, &unused& })
private static String collectionTypeToString(String scope, Object obj,
List visitedObjs) {
StringBuffer buffer = new StringBuffer(&&);
if (obj.getClass().isArray()) {
if (Array.getLength(obj) & 0) {
for (int j = 0; j & Array.getLength(obj); j++) {
Object x = Array.get(obj, j);
buffer.append(typeToString(scope + &[& + j + &]&, x,
visitedObjs));
buffer.append(scope + &[]: empty\n&);
boolean isCollection = (obj instanceof Collection);
boolean isHashTable = (obj instanceof Hashtable);
boolean isHashMap = (obj instanceof HashMap);
boolean isHashSet = (obj instanceof HashSet);
boolean isAbstractMap = (obj instanceof AbstractMap);
boolean isMap = isAbstractMap || isHashMap || isHashT
if (isMap) {
Set keySet = ((Map) obj).keySet();
Iterator iterator = keySet.iterator();
int size = keySet.size();
if (size & 0) {
for (int j = 0; iterator.hasNext(); j++) {
Object key = iterator.next();
Object x = ((Map) obj).get(key);
buffer.append(typeToString(scope + &[& + key + &]&, x,
visitedObjs));
buffer.append(scope + &[]: empty\n&);
} else if (/* isHashTable || */
isCollection || isHashSet /* || isHashMap */
Iterator iterator =
int size = 0;
if (obj != null) {
if (isCollection) {
iterator = ((Collection) obj).iterator();
size = ((Collection) obj).size();
} else if (isHashTable) {
iterator = ((Hashtable) obj).values().iterator();
size = ((Hashtable) obj).size();
} else if (isHashSet) {
iterator = ((HashSet) obj).iterator();
size = ((HashSet) obj).size();
} else if (isHashMap) {
iterator = ((HashMap) obj).values().iterator();
size = ((HashMap) obj).size();
if (size & 0) {
for (int j = 0; iterator.hasNext(); j++) {
Object x = iterator.next();
buffer.append(typeToString(scope + &[& + j + &]&,
x, visitedObjs));
buffer.append(scope + &[]: empty\n&);
// theObject is null
buffer.append(scope + &[]: null\n&);
return (buffer.toString());
* Method typeToString
* @param scope
* @param obj
* @param visitedObjs
* @return String
@SuppressWarnings({ &rawtypes&, &unchecked& })
private static String typeToString(String scope, Object obj,
List visitedObjs) {
if (obj == null) {
return (scope + &: null\n&);
} else if (isCollectionType(obj)) {
return collectionTypeToString(scope, obj, visitedObjs);
} else if (isComplexType(obj)) {
if (!visitedObjs.contains(obj)) {
visitedObjs.add(obj);
return complexTypeToString(scope, obj, visitedObjs);
return (scope + &: &already visited&\n&);
return (scope + &: & + obj.toString() + &\n&);
* The typeToString() method is used to dump the contents of a passed object
* of any type (or collection) to a String. This can be very useful for
* debugging code that manipulates complex structures.
* @param scope
* @param obj
* @return String
@SuppressWarnings(&rawtypes&)
public static String typeToString(String scope, Object obj) {
if (obj == null) {
return (scope + &: null\n&);
} else if (isCollectionType(obj)) {
return collectionTypeToString(scope, obj, new ArrayList());
} else if (isComplexType(obj)) {
return complexTypeToString(scope, obj, new ArrayList());
return (scope + &: & + obj.toString() + &\n\r&);
class SMSModel{
public SMSModel(){};
public SMSModel(Integer id, String address, String name,
String descript, String time, String number, String score) {
this.address =
this.name =
this.descript =
this.time =
this.number =
this.score =
public static void main(String[] args) {
//fuck 差点忘记内部类怎么实例化了。。
//TypeUtil.SMSModel smsModel=new TypeUtil().new SMSModel();
TypeUtil.SMSModel model=new TypeUtil().new SMSModel(12, &广西大学西校园10栋204 宿舍&, &云守护&,
&我在参加信息安全大赛呢&, &&, &1&, &100&);
System.out.println(TypeUtil.typeToString(&test&, model));
附上截图:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1837180次
积分:26146
积分:26146
排名:第236名
原创:784篇
转载:383篇
评论:227条
我的其他技术博客站点,欢迎关注。
(1)(4)(3)(3)(4)(7)(18)(17)(26)(13)(39)(31)(17)(18)(34)(21)(42)(49)(10)(14)(10)(11)(21)(21)(26)(24)(15)(17)(24)(9)(24)(14)(17)(15)(24)(39)(28)(14)(19)(27)(35)(10)(16)(31)(12)(13)(41)(32)(16)(18)(14)(2)(10)(37)(9)(29)(3)(30)(12)(16)(10)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'查看: 2202|回复: 0
通过Java反射机制,动态给对象属性赋值,并获取属性值
import java.lang.reflect.Fimport java.lang.reflect.Mimport java.text.SimpleDateFimport java.util.Dimport java.util.HashMimport java.util.Limport java.util.Mimport java.util.Map.E /* * 通过Java反射机制,动态给对象属性赋值,并获取属性值 */public class ClassRefUtil {
* @param args
public static void main(String[] args) {
Map&String, String& valMap = new HashMap&String, String&();
valMap.put(&userName&, &michael&);
valMap.put(&age&, &27&);
valMap.put(&height&, &173.5&);
valMap.put(&date&, &&);
valMap.put(&times&, &6&);
valMap.put(&flag&, &false&);
ChildInfo rl = new ChildInfo();
System.out.println(&通过反射赋值.&);
PublicUtil.setFieldValue(rl, valMap);
System.out.println(&通过反射取值:&);
int i = 0;
Map&String, String& fieldValMap = PublicUtil.getFieldValueMap(rl);
for (Entry&String, String& entry : fieldValMap.entrySet()) {
System.out.println(&[字段 &+i+&] [&+entry.getKey()+&]
[& + entry.getValue()+&]&);
* 取Bean的属性和值对应关系的MAP
* @param bean
* @return Map
public static Map&String, String& getFieldValueMap(Object bean) {
Class&?& cls = bean.getClass();
Map&String, String& valueMap = new HashMap&String, String&();
// 取出bean里的所有方法
Method[] methods = cls.getDeclaredMethods();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
String fieldType = field.getType().getSimpleName();
String fieldGetName = parGetName(field.getName());
if (!checkGetMet(methods, fieldGetName)) {
Method fieldGetMet = cls.getMethod(fieldGetName, new Class[] {});
Object fieldVal = fieldGetMet.invoke(bean, new Object[] {});
String result =
if (&Date&.equals(fieldType)) {
result = fmtDate((Date) fieldVal);
if (null != fieldVal) {
result = String.valueOf(fieldVal);
valueMap.put(field.getName(), result);
} catch (Exception e) {
return valueM
* set属性的值到Bean
* @param bean
* @param valMap
public static void setFieldValue(Object bean, Map&String, String& valMap) {
Class&?& cls = bean.getClass();
// 取出bean里的所有方法
Method[] methods = cls.getDeclaredMethods();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
String fieldSetName = parSetName(field.getName());
if (!checkSetMet(methods, fieldSetName)) {
Method fieldSetMet = cls.getMethod(fieldSetName, field.getType());
String value = valMap.get(field.getName());
if (null != value && !&&.equals(value)) {
String fieldType = field.getType().getSimpleName();
if (&String&.equals(fieldType)) {
fieldSetMet.invoke(bean, value);
} else if (&Date&.equals(fieldType)) {
Date temp = parseDate(value);
fieldSetMet.invoke(bean, temp);
} else if (&Integer&.equals(fieldType) || &int&.equals(fieldType)) {
Integer intval = Integer.parseInt(value);
fieldSetMet.invoke(bean, intval);
} else if (&Long&.equalsIgnoreCase(fieldType)) {
Long temp = Long.parseLong(value);
fieldSetMet.invoke(bean, temp);
} else if (&Double&.equalsIgnoreCase(fieldType)) {
Double temp = Double.parseDouble(value);
fieldSetMet.invoke(bean, temp);
} else if (&Boolean&.equalsIgnoreCase(fieldType)) {
Boolean temp = Boolean.parseBoolean(value);
fieldSetMet.invoke(bean, temp);
System.out.println(&not supper type& + fieldType);
} catch (Exception e) {
* 格式化string为Date
* @param datestr
* @return date
private static Date parseDate(String datestr) {
if (null == datestr || &&.equals(datestr)) {
String fmtstr =
if (datestr.indexOf(':') & 0) {
fmtstr = &yyyy-MM-dd HH:mm:ss&;
fmtstr = &yyyy-MM-dd&;
SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK);
return sdf.parse(datestr);
} catch (Exception e) {
* 日期转化为String
* @param date
* @return date string
private static String fmtDate(Date date) {
if (null == date) {
SimpleDateFormat sdf = new SimpleDateFormat(&yyyy-MM-dd HH:mm:ss&, Locale.US);
return sdf.format(date);
} catch (Exception e) {
* 判断是否存在某属性的 set方法
* @param methods
* @param fieldSetMet
* @return boolean
private static boolean checkSetMet(Method[] methods, String fieldSetMet) {
for (Method met : methods) {
if (fieldSetMet.equals(met.getName())) {
* 判断是否存在某属性的 get方法
* @param methods
* @param fieldGetMet
* @return boolean
private static boolean checkGetMet(Method[] methods, String fieldGetMet) {
for (Method met : methods) {
if (fieldGetMet.equals(met.getName())) {
* 拼接某属性的 get方法
* @param fieldName
* @return String
private static String parGetName(String fieldName) {
if (null == fieldName || &&.equals(fieldName)) {
return &get& + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
* 拼接在某属性的 set方法
* @param fieldName
* @return String
private static String parSetName(String fieldName) {
if (null == fieldName || &&.equals(fieldName)) {
return &set& + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
上一篇:下一篇:java反射机制怎么判断一个属性是否为私有属性_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:658,906贴子:
java反射机制怎么判断一个属性是否为私有属性收藏
各位大神请赐教。
java!上元教育手把手教你java编程,长期开班,实战培训教程,新手变高手.java课程报名详情点击咨询.
getdeclarefields()然后迭代每个field,再拿到修饰符
getDelareFields,好像类对象有这个个方法
有请楼下的Angelababy为我们回答几个问题1 什么一抖,车票到手?2 比谁提前3天预约抢票?3 成功率提高多少倍?4 什么时间抢票就靠它了?5 详情在哪?请在10秒内作答
package com.java反射机制;import java.lang.reflect.Aimport java.lang.reflect.Cimport java.lang.reflect.Fimport java.lang.reflect.Mpublic class ReflectTest {// public static String staticStr = &statictest&;// public String property = new String(&test&);// private String privateStr = &privateStr&;// public static void main(String[] args) {//// ReflectTest rt = new ReflectTest();// System.out.println(rt.getProperty(rt,// &property&));//通过反射机制打印出对象中的某个公共属性// System.out.println(rt.getProperty(rt,// &property&).getClass());//通过反射机制打印出对象中的某个公共读属性对象对应的Class对象// System.out.println(rt.getProperty(rt, &staticStr&));// System.out.println(rt.getProperty(rt, &privateStr&));//// rt.getAllProperty(rt);// System.out.println(rt.staticStr);// System.out.println(rt.property);// System.out.println(rt.privateStr);// }/*** * 得到某个对象的公共属性。* * @return*/public Object getProperty(Object owner, String fieldName) {Class ownerClass = owner.getClass();Object property =Ftry {field = ownerClass.getField(fieldName);property = field.get(owner);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/***
o* @return* *
无脑赋,对所有属性都统一赋值。*/public void getAllProperty(Object o) {Class c = o.getClass();Field[] fields = c.getDeclaredFields();// 此方法得到类中所有字段for (int i = 0; i & fields. i++) {fields[i].setAccessible(true);// 访问私有必须调用,否者在其他类调用这个方法的时候回报错String filedName = fields[i].getName();System.out.println(filedName);try {fields[i].set(o, &change&);// 这个方法就可以对反射获取都的类中的各个属性进行赋值了。} catch (IllegalArgumentException | IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*** 得到所有属性之后对属性进行判断,只为String类型和private属性进行赋值*/public void assignment(Object o) {Class c = o.getClass();Field[] fields = c.getDeclaredFields();// 此方法得到类中所有字段for (int i = 0; i & fields. i++) {/** 这个本来是用来测试判断属性是否为私有属性的,但是实际证明没有什么卵用。* * if(fields[i].isAccessible()){System.out.print(&私有属性被捕捉到了:&);}else{System.out.print(&非私有属性被捕捉到了:&);}*/fields[i].setAccessible(true);// 访问私有必须调用,否者在其他类调用这个方法的时候回报错String filedName = fields[i].getName();/*System.out.println(filedName);*/// 判断类型Class&?& type = fields[i].getType();try {System.out.println(fields[i].get(o));if (&java.lang.String&.equals(type.getName())) {System.out.println(&当前的属性& + filedName + &类型(&+ type.getName() + &)匹配正确&);fields[i].set(o, &change&);// 这个方法就可以对反射获取都的类中的各个属性进行赋值了。} else {System.out.println(&当前的属性& + filedName + &类型(&+ type.getName() + &)匹配不正确&);}System.out.println(fields[i].get(o));} catch (IllegalArgumentException | IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*** 通过反射机制执行对象中的方法。* @param owner目标对象* @param methodName要执行的方法名* @param args方法的参数数组*/public Object invokeMethod(Object owner, String methodName, Object[] args){Object o =Class ownerClass = owner.getClass();Class[] argsClass = new Class[args.length];for(int i=0; i&args. i++){argsClass[i] = args[i].getClass();}try {//获取Class对象为ownerClass的实例中名字为methodName,参数对象数组的Class对象为argsClass的方法。Method method = ownerClass.getMethod(methodName, argsClass);//通过反射机制来执行这个方法。o = method.invoke(owner, args);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 执行某个类的静态方法。* * @param className 类的完整名字,包括包名* @param methodName 方法的名字* @param args方法的参数对象数组* @return* @throws Exception */public Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception{Class ownerClass = Class.forName(className);Class[] argsClass = new Class[args.length];for(int i=0; i&args. i++){argsClass[i] = args[i].getClass();}Method method = ownerClass.getMethod(methodName, argsClass);//通过method对象来调用,因为是静态方法,所以调用对象必须是null,记得要传进方法的参数对象数组。return method.invoke(null, args);}/*** 通过Constructor对象来创建对象* * @param className* @param args* @return* @throws xception */public Object newInstance(String className, Object[] args) throws Exception{Class ownerClass = Class.forName(className);Class[] argsClass = new Class[args.length];for(int i=0; i&args. i++){argsClass[i] = args[i].getClass();}Constructor cons = ownerClass.getConstructor(argsClass);return cons.newInstance(args);}/**
* 是不是某个类的实例
* @param obj 实例
* @param cls 类
* @return 如果 obj 是此类的实例,则返回 true
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
* 得到数组中的某个元素
* @param array 数组
* @param index 索引
* @return 返回指定数组对象中索引组件的值
public Object getByArray(Object array, int index) {
return Array.get(array,index);
package com.java反射机制;public class TestBean {public static String s1 = &&;public String s2 = &&;private String s3 = &s3&;public Integer i1 = 1;private Integer i2 = 2;public TestBean(){}public TestBean(String str){this.s2 =}public String method1(String str){System.out.println(str);return new String(&method1 finish&);}public void method2(){System.out.println(&void test&);}public static String method3(String str){System.out.println(str);return new String(&method3 finish&);}}
package com.java反射机制;public class Client {public static void main(String[] args) throws Exception{ReflectTest rt = new ReflectTest();TestBean tb = new TestBean();//rt.getAllProperty(tb);//rt.assignment(tb);String s = &构造器测试&;String[] ss = new String[1];ss[0] =//Object result1 = rt.invokeMethod(tb, &method1&, ss);//System.out.println(result1);//Object result3 = rt.invokeStaticMethod(&com.java反射机制.TestBean&, &method3&, ss);//System.out.println(result3);Object o1 = rt.newInstance(&com.java反射机制.TestBean&, ss);TestBean bt1 = (TestBean)o1;System.out.println(bt1.s2);System.out.println(rt.isInstance(bt1, TestBean.class));//判断是不是某个类的实例System.out.println(rt.getByArray(ss, 0));}}
不是isAccessible()吗,API里都有,记得有事先查API
isAccessible()
2017java学习来上市公司博为峰学java,入学即签就业协议,不就业不收费,查看java课程!java好学吗?java课程来博为峰学,java工程师就业年薪十几万!
还要记得不要用中文的api哦
学习了。。
只能帮你到这了,以后还是要靠你自己,程序员学东西,不只是光学死知识,更重要的事解决问题的能力以及思路, ps:不会就多百度google查啊。。。
登录百度帐号推荐应用

我要回帖

更多关于 java 反射机制详解 的文章

 

随机推荐