- 浏览: 211251 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
jongde1:
Axure太难学了,分享mockplus工具,有兴趣可以去了解 ...
Axure RP 原型设计工具 -
di1984HIT:
这里面提到了好几种解决办法。
Spring AOP对日志记录、Exception日志记录 -
di1984HIT:
学习一下。
spring struts2 零配置 -
di1984HIT:
不错,不错啊
Struts2防止表单重复提交 -
di1984HIT:
kettle怎么样啊。
Kettle初探
使用反射循环查找所有父类属性
其实实现
public static Set<Field> getClassAllFields(Class clazz,Set<Field> allGenericFields) { // 如果clazz为空则直接返回 if (clazz == null) return allGenericFields; Object parent = clazz.getGenericSuperclass(); // 如果有父类并且父类不是Object 则递归调用 if (parent != null && !((Class) parent).getName().equals("Object")) { getClassAllFields((Class) parent,allGenericFields); } Field[] fields = clazz.getDeclaredFields(); if (fields != null) {// 如果clazz存在声明的属性 for (int i = 0; i < fields.length; i++) allGenericFields.add(fields[i]); } // 存在父类则递归调用 return allGenericFields; } public static Set<Field> getClassAllFields(Class clazz){ Set<Field> allGenericFields = new HashSet<Field>(); // List<Field> allGenericFields = new ArrayList<Field>(); return getClassAllFields(clazz,allGenericFields); }
其实实现
/** * 父类 * @author syh * */ public class Parent { public String publicField = "1"; String defaultField = "2"; protected String protectedField = "3"; private String privateField = "4" ; public void publicMethod() { System.out.println("publicMethod..."); } void defaultMethod() { System.out.println("defaultMethod..."); } protected void protectedMethod() { System.out.println("protectedMethod..."); } private void privateMethod() { System.out.println("privateMethod..."); } } public class Son extends Parent{ } import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 方法类 * @author syh * */ public class ReflectionUtils { /** * 循环向上转型, 获取对象的 DeclaredMethod * @param object : 子类对象 * @param methodName : 父类中的方法名 * @param parameterTypes : 父类中的方法参数类型 * @return 父类中的方法对象 */ public static Method getDeclaredMethod(Object object, String methodName, Class<?> ... parameterTypes){ Method method = null ; for(Class<?> clazz = object.getClass() ; clazz != Object.class ; clazz = clazz.getSuperclass()) { try { method = clazz.getDeclaredMethod(methodName, parameterTypes) ; return method ; } catch (Exception e) { //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了 } } return null; } /** * 直接调用对象方法, 而忽略修饰符(private, protected, default) * @param object : 子类对象 * @param methodName : 父类中的方法名 * @param parameterTypes : 父类中的方法参数类型 * @param parameters : 父类中的方法参数 * @return 父类中方法的执行结果 */ public static Object invokeMethod(Object object, String methodName, Class<?> [] parameterTypes, Object [] parameters) { //根据 对象、方法名和对应的方法参数 通过反射 调用上面的方法获取 Method 对象 Method method = getDeclaredMethod(object, methodName, parameterTypes) ; //抑制Java对方法进行检查,主要是针对私有方法而言 method.setAccessible(true) ; try { if(null != method) { //调用object 的 method 所代表的方法,其方法的参数是 parameters return method.invoke(object, parameters) ; } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return null; } /** * 循环向上转型, 获取对象的 DeclaredField * @param object : 子类对象 * @param fieldName : 父类中的属性名 * @return 父类中的属性对象 */ public static Field getDeclaredField(Object object, String fieldName){ Field field = null ; Class<?> clazz = object.getClass() ; for(; clazz != Object.class ; clazz = clazz.getSuperclass()) { try { field = clazz.getDeclaredField(fieldName) ; return field ; } catch (Exception e) { //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。 //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了 } } return null; } /** * 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter * @param object : 子类对象 * @param fieldName : 父类中的属性名 * @param value : 将要设置的值 */ public static void setFieldValue(Object object, String fieldName, Object value){ //根据 对象和属性名通过反射 调用上面的方法获取 Field对象 Field field = getDeclaredField(object, fieldName) ; //抑制Java对其的检查 field.setAccessible(true) ; try { //将 object 中 field 所代表的值 设置为 value field.set(object, value) ; } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } /** * 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter * @param object : 子类对象 * @param fieldName : 父类中的属性名 * @return : 父类中的属性值 */ public static Object getFieldValue(Object object, String fieldName){ //根据 对象和属性名通过反射 调用上面的方法获取 Field对象 Field field = getDeclaredField(object, fieldName) ; //抑制Java对其的检查 field.setAccessible(true) ; try { //获取 object 中 field 所代表的属性值 return field.get(object) ; } catch(Exception e) { e.printStackTrace() ; } return null; } } import static org.junit.Assert.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; /** * 测试类,用JUnit4 进行测试 * @author syh * */ public class ReflectionUtilsTest { /** * 测试获取父类的各个方法对象 */ @Test public void testGetDeclaredMethod() { Object obj = new Son() ; //获取公共方法名 Method publicMethod = ReflectionUtils.getDeclaredMethod(obj, "publicMethod") ; System.out.println(publicMethod.getName()); //获取默认方法名 Method defaultMethod = ReflectionUtils.getDeclaredMethod(obj, "defaultMethod") ; System.out.println(defaultMethod.getName()); //获取被保护方法名 Method protectedMethod = ReflectionUtils.getDeclaredMethod(obj, "protectedMethod") ; System.out.println(protectedMethod.getName()); //获取私有方法名 Method privateMethod = ReflectionUtils.getDeclaredMethod(obj, "privateMethod") ; System.out.println(privateMethod.getName()); } /** * 测试调用父类的方法 * @throws Exception */ @Test public void testInvokeMethod() throws Exception { Object obj = new Son() ; //调用父类的公共方法 ReflectionUtils.invokeMethod(obj, "publicMethod", null , null) ; //调用父类的默认方法 ReflectionUtils.invokeMethod(obj, "defaultMethod", null , null) ; //调用父类的被保护方法 ReflectionUtils.invokeMethod(obj, "protectedMethod", null , null) ; //调用父类的私有方法 ReflectionUtils.invokeMethod(obj, "privateMethod", null , null) ; } /** * 测试获取父类的各个属性名 */ @Test public void testGetDeclaredField() { Object obj = new Son() ; //获取公共属性名 Field publicField = ReflectionUtils.getDeclaredField(obj, "publicField") ; System.out.println(publicField.getName()); //获取公共属性名 Field defaultField = ReflectionUtils.getDeclaredField(obj, "defaultField") ; System.out.println(defaultField.getName()); //获取公共属性名 Field protectedField = ReflectionUtils.getDeclaredField(obj, "protectedField") ; System.out.println(protectedField.getName()); //获取公共属性名 Field privateField = ReflectionUtils.getDeclaredField(obj, "privateField") ; System.out.println(privateField.getName()); } @Test public void testSetFieldValue() { Object obj = new Son() ; System.out.println("原来的各个属性的值: "); System.out.println("publicField = " + ReflectionUtils.getFieldValue(obj, "publicField")); System.out.println("defaultField = " + ReflectionUtils.getFieldValue(obj, "defaultField")); System.out.println("protectedField = " + ReflectionUtils.getFieldValue(obj, "protectedField")); System.out.println("privateField = " + ReflectionUtils.getFieldValue(obj, "privateField")); ReflectionUtils.setFieldValue(obj, "publicField", "a") ; ReflectionUtils.setFieldValue(obj, "defaultField", "b") ; ReflectionUtils.setFieldValue(obj, "protectedField", "c") ; ReflectionUtils.setFieldValue(obj, "privateField", "d") ; System.out.println("***********************************************************"); System.out.println("将属性值改变后的各个属性值: "); System.out.println("publicField = " + ReflectionUtils.getFieldValue(obj, "publicField")); System.out.println("defaultField = " + ReflectionUtils.getFieldValue(obj, "defaultField")); System.out.println("protectedField = " + ReflectionUtils.getFieldValue(obj, "protectedField")); System.out.println("privateField = " + ReflectionUtils.getFieldValue(obj, "privateField")); } @Test public void testGetFieldValue() { Object obj = new Son() ; System.out.println("publicField = " + ReflectionUtils.getFieldValue(obj, "publicField")); System.out.println("defaultField = " + ReflectionUtils.getFieldValue(obj, "defaultField")); System.out.println("protectedField = " + ReflectionUtils.getFieldValue(obj, "protectedField")); System.out.println("privateField = " + ReflectionUtils.getFieldValue(obj, "privateField")); } }
发表评论
-
Linux下部署多个Tomcat多个域名
2015-12-12 19:02 3694一、安装JDK 1、安装jdk-7u79-linux-x64. ... -
linux下安装swftools和openOffice
2015-07-03 17:09 744最近公司实现一个仿豆丁网百度文库阅读器的功能,需要用到两个软件 ... -
redis Java develop
2014-10-23 18:01 6541. http://javacrazyer.iteye.com ... -
验证码 原理 破解
2014-08-20 17:52 616验证码 原理 破解 reference: http://bl ... -
HttpClient 学习经验
2014-08-14 11:01 660HttpClient学习经验 HttpCl ... -
P2P resources
2013-12-09 18:24 9731.P2P导航收录 http://www.p2peye.com ... -
运用加密技术保护Java源代码
2013-06-08 08:38 1108运用加密技术保护Java源代码 http://www.ibm ... -
log4j.properties配置详解
2013-03-15 17:00 0log4j.properties配置详解 Log4J的配置文 ... -
Struts 2 studing
2012-12-28 17:28 7351. Struts 2的基石——拦截器(Interceptor ... -
J2EE项目异常处理
2012-12-26 11:08 1093J2EE项目异常处理 为什 ... -
如何将基于 Struts、Spring 和 Hibernate 的应用从 Tomcat 迁移到 WebSphere Application Server
2012-12-21 10:28 1182引言 现在很多的企业都 ... -
详解spring事务属性
2012-12-20 10:22 817Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我 ... -
Java List Copy,Remove容易出现的问题
2012-11-15 03:08 1019懒程序员,在代码越写越多的情况下,总想着使用把代码精简一 ... -
MySQL---ORACLE序列解决方案
2012-11-13 00:55 1193MySQL自增长与Oracle序列的区别: 自增长只能用于表 ... -
list,set,map,数组间的相互转换
2012-11-02 01:25 958list,set,map,数 ... -
java bean自动进行rowMapper or handler的类
2012-10-20 03:14 1315一般情况下在进行jdbc编程的时候避免不了的要写n多的bean ... -
URL encoding 乱码处理
2012-10-10 15:53 888搞了两三天的乱码处理,试了很多方法,过滤器啊,编码转换啊,试来 ... -
JAVA 按任意角度旋转图片,并生成新的旋转后图片
2012-07-11 11:03 3650JAVA 按任意角度旋转图片,并生成新的旋转 ... -
QR Code
2012-06-12 12:29 01. 在线生成QR Code 网站 http://www. ... -
convert BufferedImage to byte[]
2012-06-12 11:26 1235How to convert BufferedImage to ...
相关推荐
在"利用Java反射技术实现动态搜索所有字段"这个主题中,我们将深入探讨如何使用Java反射API来查找并操作类的所有字段。以下是一些关键知识点: 1. **反射基础**:反射始于`java.lang.Class`类,它是所有Java类的...
这种做法在处理未知类型或需要动态访问对象属性时非常有用,但需要注意的是,反射可能会降低程序的性能,因为它涉及了运行时的类查找和方法调用。因此,在能避免使用反射的情况下,通常应优先选择直接访问字段或方法...
4. **搜索继承的所有属性**:`getFields()`和`getDeclaredFields()`只能获取当前类的字段,需递归获取所有父类字段以避免遗漏。 5. **选择合适的遍历策略**:深度优先和广度优先各有优劣。深度优先可能导致较短的...
showBreak.java 利用标号语句跳转出所有循环嵌套 showCount.java 循环计数示例 showDoubleLoop.java 演示双重循环 showDoubleLoopSe.java 改进的双重循环 showOrder_1.java 演示操作数求值顺序示例1 showOrder...
4.5.2使用super调用父类的构造方法157 4.6继承的内部处理158 4.7多态的基本概念159 4.8重载159 4.8.1普通方法的重载160 4.8.2构造方法的重载161 4.8.3重载的解析163 4.8.4重载与覆盖的区别165 4.9运行时多态...
7.2.2 使用foreach循环遍历集合元素 246 7.3 Set接口 247 7.3.1 HashSet类 247 学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 EnumSet类 259 7.4 List接口 261 7.4.1 List...
- **继承**:子类如何继承父类的属性和行为,super关键字的用法。 - **多态**:接口的定义与实现、抽象类的使用,了解重写(override)和重载(overload)的区别。 - **异常处理**:try-catch-finally语句的使用,自定义...
继承允许子类继承父类的属性和方法,多态则提供了多种表现形式的能力。 3. **异常处理**:Java中的异常处理是通过try-catch-finally语句块实现的,用于捕获并处理运行时错误,确保程序的健壮性。 4. **集合框架**...
继承允许一个类(子类)从另一个类(父类)继承属性和行为。封装是隐藏实现细节,多态性则提供了一种使用通用接口处理不同类型的对象的能力。 3. **异常处理**:Java的异常处理机制可以帮助开发者捕获和处理程序...
- **继承**:子类继承父类的所有属性和方法。 - **实现**:通常指实现接口,即实现接口中声明的所有抽象方法。 - 示例代码说明两者之间的区别及其适用场景。 **抽象关键字为什么不能和private、static、final共存**...
实例033 使用while与自增运算符循环遍历 数组 43 实例034 使用for循环输出杨辉三角 43 实例035 使用嵌套循环在控制台上输出 九九乘法表 44 实例036 用while循环计算1+1/2!+1/3!…1/20! 45 实例037 for循环输出空心的...
- 循环结构:for循环、while循环和do-while循环,以及break和continue语句的应用。 - 跳转语句:如goto(Java中不推荐使用)和其他控制流程语句。 5. **方法(函数)**: - 方法的定义、调用和参数传递,理解...
继承允许子类从父类继承属性和行为,从而实现代码重用。封装确保数据的安全性,多态性则提供了更灵活的编程方式。 异常处理是JavaSE中的重要组成部分,它通过try-catch-finally语句块来捕获和处理运行时错误。理解...
继承允许一个类(子类)继承另一个类(父类)的属性和方法,实现代码复用;多态则是同一消息可以被不同对象响应,增强了程序的灵活性。 4. **异常处理**:Java使用异常处理来处理程序运行时可能遇到的问题,比如...
- **类的定义**:类是对象的蓝图,使用class关键字定义,包含属性(成员变量)和行为(方法)。 - **对象的创建**:通过new关键字和构造函数创建对象。 - **封装**:通过private、public等访问修饰符实现数据封装...
2. **基本语法与数据类型**:Java实例通常会包含变量声明、数据类型(如整型、浮点型、字符型、布尔型)、运算符和控制结构(如if语句、switch语句、for循环、while循环和do-while循环)的使用。 3. **流程控制**:...
继承使得子类可以继承父类的属性和方法,实现代码重用;多态性则允许我们使用一个接口处理不同类型的对象,增强了代码的灵活性。 手册中的内容可能包括以下几个方面: 1. **基础语法**:涵盖变量、数据类型、...