java反射的工具类的函数集合

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;/*** 反射的 Utils 函数集合* 提供访问私有变量, 获取泛型类型 Class, 提取集合中元素属性等 Utils 函数* @author Administrator**/
public class ReflectionUtils {/*** 通过反射, 获得定义 Class 时声明的父类的泛型参数的类型* 如: public EmployeeDao extends BaseDao<Employee, String>* @param clazz* @param index* @return*/@SuppressWarnings("unchecked")public static Class getSuperClassGenricType(Class clazz, int index){Type genType = clazz.getGenericSuperclass();if(!(genType instanceof ParameterizedType)){return Object.class;}Type [] params = ((ParameterizedType)genType).getActualTypeArguments();if(index >= params.length || index < 0){return Object.class;}if(!(params[index] instanceof Class)){return Object.class;}return (Class) params[index];}/*** 通过反射, 获得 Class 定义中声明的父类的泛型参数类型* 如: public EmployeeDao extends BaseDao<Employee, String>* @param <T>* @param clazz* @return*/@SuppressWarnings("unchecked")public static<T> Class<T> getSuperGenericType(Class clazz){return getSuperClassGenricType(clazz, 0);}/*** 循环向上转型, 获取对象的 DeclaredMethod* @param object* @param methodName* @param parameterTypes* @return*/public static Method getDeclaredMethod(Object object, String methodName, Class<?>[] parameterTypes){for(Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()){try {//superClass.getMethod(methodName, parameterTypes);return superClass.getDeclaredMethod(methodName, parameterTypes);} catch (NoSuchMethodException e) {//Method 不在当前类定义, 继续向上转型}//..}return null;}/*** 使 filed 变为可访问* @param field*/public static void makeAccessible(Field field){if(!Modifier.isPublic(field.getModifiers())){field.setAccessible(true);}}/*** 循环向上转型, 获取对象的 DeclaredField* @param object* @param filedName* @return*/public static Field getDeclaredField(Object object, String filedName){for(Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()){try {return superClass.getDeclaredField(filedName);} catch (NoSuchFieldException e) {//Field 不在当前类定义, 继续向上转型}}return null;}/*** 直接调用对象方法, 而忽略修饰符(private, protected)* @param object* @param methodName* @param parameterTypes* @param parameters* @return* @throws InvocationTargetException * @throws IllegalArgumentException */public static Object invokeMethod(Object object, String methodName, Class<?> [] parameterTypes,Object [] parameters) throws InvocationTargetException{Method method = getDeclaredMethod(object, methodName, parameterTypes);if(method == null){throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + object + "]");}method.setAccessible(true);try {return method.invoke(object, parameters);} catch(IllegalAccessException e) {System.out.println("不可能抛出的异常");} return null;}/*** 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter* @param object* @param fieldName* @param value*/public static void setFieldValue(Object object, String fieldName, Object value){Field field = getDeclaredField(object, fieldName);if (field == null)throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");makeAccessible(field);try {field.set(object, value);} catch (IllegalAccessException e) {System.out.println("不可能抛出的异常");}}/*** 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter* @param object* @param fieldName* @return*/public static Object getFieldValue(Object object, String fieldName){Field field = getDeclaredField(object, fieldName);if (field == null)throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]");makeAccessible(field);Object result = null;try {result = field.get(object);} catch (IllegalAccessException e) {System.out.println("不可能抛出的异常");}return result;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot Server容器配置

转载自 Spring Boot Server容器配置参数配置容器 server.xx开头的是所有servlet容器通用的配置&#xff0c;server.tomcat.xx开头的是tomcat特有的参数&#xff0c;其它类似。 所有参数绑定配置类&#xff1a;org.springframework.boot.autoconfigure.web.ServerProperties 代码…

MVC之删除

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.04.17在页面的数据表格中&#xff0c;既然有新增&#xff0c;那一定也有删除吧。那MVC是怎么写删除的呢&#xff0c;就让我来讲一下吧。 删除一般有删除单条数据和删除多条数…

转】Eclipse编辑Spring配置文件xml时自动提示类class包名

转自 http://bigdragon.iteye.com/blog/2396081 第一步&#xff0c;先查看下自己的Eclipse是什么版本&#xff0c;步骤如下&#xff1a; 1.1 点击Eclipse菜单‘Help -> About Eclipse’&#xff0c;如下图&#xff1a; 1.2 点击Eclipse图标如下&#xff0c;看清楚哦&…

Spring Boot读取配置的几种方式

转载自 Spring Boot读取配置的几种方式读取application文件 在application.yml或者properties文件中添加&#xff1a; info.addressUSA info.companySpring info.degreehighValue注解读取方式import org.springframework.beans.factory.annotation.Value; import org.springfra…

MVC之修改

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.04.24ASP.NET MCV的增删查改在我前面的讲解中&#xff0c;我已经把前三个都说了一下&#xff0c;现在就只剩下修改没讲了。所以&#xff0c;我今天就给你们讲一下&#xff0c…

VMnet1和VMnet8 未识别的网络的解决方法

转自&#xff1a; https://blog.csdn.net/jackphang/article/details/8939738 我的系统是win7 64位&#xff0c;它居然不能识别VMnet1和VMnet8&#xff0c;在网上找了些资料&#xff0c;发现所有资料都是一样的。不过事实证明是正确的。 解决办法&#xff1a; 1&#xff0c;在…

jps命令:查看Java进程等详细信息

转载自 jps命令&#xff1a;查看Java进程等详细信息jps是java自带的查看java进程的命令&#xff0c;通过这个命令可以查看当前系统所有运行中的java进程、java包名、jar包名及JVM参数等。jps -help 可以查看命令用法。-q: 只显示VM 标示&#xff0c;不显示jar,class, main参数等…

MVC如何添加Model

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.04.27初步学习MVC编程模式的时候&#xff0c;我基本清楚了如何创建MVC&#xff0c;而添加model&#xff08;模型&#xff09;似乎还不够理解&#xff0c;通过学习我大概了解了…

在win10系统中安装Visual C++ 6.0的具体方法

转自&#xff1a; https://blog.csdn.net/qq_39235641/article/details/79102694 很多学C语言的同学很熟悉VC6.0&#xff0c;但是在win10系统下&#xff0c;VC6.0便无法打开&#xff0c;报错&#xff1a;0x0000142。这是因为汉化版本和最新的win10系统兼容性不好导致的。win10…

如何设计一个安全的登录流程

转载自 如何设计一个安全的登录流程登录是系统中最重要的一个功能之一&#xff0c;登录成功就能拥有系统的使用权利&#xff0c;所以设计一个安全的登录流程是十分必要的&#xff0c;那在一般登录中需要考虑哪些重要因素呢&#xff1f;我们一一列表一下。使用https协议进行传输…

如何导入数据模板到MVC

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.5.3在平常的生活中&#xff0c;我们可能需要添加大量的数据&#xff0c;这时一条一条地新增肯定不能满足我们的要求了&#xff0c;所以我们就需要批量导入数据了。现在我就来…

在左表或右表的连接字段上建立索引对左、内连接的查询效率的优化情况分析

-- 1、建表 drop table if exists dept_tbl;create table dept_tbl (rcrd_id int unsigned primary key auto_increment comment 记录编号, dept_id int unsigned not null comment 部门编号) engine innodb default charsetutf8 comment 部门表;drop table if exists emp_tb…

并发控制--悲观锁和乐观锁详解

转载自 并发控制--悲观锁和乐观锁详解背景考虑下面两个并发带来的问题&#xff1a;1、丢失更新&#xff1a;一个事务的更新结果覆盖了其它事务的更新结果&#xff0c;即所谓的更新丢失。2、脏读&#xff1a;当一个事务读取其它完成一半事务的记录时&#xff0c;就会发生脏读取。…

如何导出数据到Excel表格

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.5.5我们在日常的生活中常常会看到很多的数据&#xff0c;有时&#xff0c;我们不一定只是在项目里面看到数据&#xff0c;可能我们还要在其他的地方使用&#xff0c;这时我们…

mysql批量插入数据的函数和存储过程

-- 创建函数前&#xff0c;设置 set global log_bin_trust_function_creatorsTRUE; -- 新建函数-产生随机的字符串 drop function if exists rand_str; delimiter ## create function rand_str(n int) returns varchar(255) begin declare chars_str varchar(100) default abc…

打印水晶报表

开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.5.8我们在日常生活中常常会打印很多东西&#xff0c;所以我打算讲一下是怎么打印水晶报表的。 打印水晶报表其实和导出差不多&#xff0c;只是有一点不同。打印也用到了多条件…

Java提升篇-事务隔离级别和传播机制

转载自 Java提升篇&#xff0d;事务隔离级别和传播机制问题的提出为了保证并发操作数据的正确性及一致性&#xff0c;SQL规范于1992年提出了数据库事务隔离级别。事务隔离级别分类事务隔离级别由低往高可分为以下几类READ UNCOMMITTED&#xff0c;读取未提交的数据。这是最不安…

多个会话对表加表级读锁和表级写锁后的操作权限分析(表级读锁+表级写锁)

【0】README&#xff1a; 不论是加读锁还是写锁&#xff0c;必须要等到其他数据库连接关闭后才可以进行&#xff1b; 【1】添加表级读锁 1.1&#xff09;多会话执行的时序操作分析&#xff1a; 1.2&#xff09;session1执行的具体时序操作&#xff1b; mysql> select * …

如何写登录验证

如何写登录验证 开发工具与关键技术&#xff1a;Visual Studio、MVC 作者&#xff1a;幻奏 撰写时间&#xff1a;2019.05.12我们都知道很多网站都会有登录的界面&#xff0c;目的就是要验证你的账号是否正确&#xff0c;不正确就不能登录&#xff0c;这样就能防止有其他目的的…

关于Java序列化你应该知道的一切

转载自 关于Java序列化你应该知道的一切 什么是序列化 我们的对象并不只是存在内存中&#xff0c;还需要传输网络&#xff0c;或者保存起来下次再加载出来用&#xff0c;所以需要Java序列化技术。 Java序列化技术正是将对象转变成一串由二进制字节组成的数组&#xff0c;可以通…