java反射机制实例
1.通过数据库字段反射给对象实例赋值
convertClass.java
/**
* 通过反射构造对象
* @param obj
* @param rs
* @return
*/
public Object convertClass(Object obj,ResultSet rs) {
try {
//得到元数据
ResultSetMetaData metaData = rs.getMetaData();
//遍历元数据
for(int i=0;i<metaData.getColumnCount();i++) {
String columName = metaData.getColumnName(i);
//转换驼峰规则
String attributeName = StatUtils.lineToHump(columName);
String attributeValue = rs.getObject(columName) != null ? rs.getObject(columName).toString() : "";
//特殊字段对格式进行处理
if(!"".equals(attributeValue)&&"BATCHTIME".equals(columName)) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
attributeValue = format.format(attributeValue);
}
StatUtils.setFieldValueByFieldName(obj, attributeName, attributeValue);
}
} catch (SQLException e) {
e.printStackTrace();
}
return obj;
}
StatUtils.java
public class StatUtils {
private static Pattern linePattern = Pattern.compile("_(\\w)");
public static String chgListStrToInStr(String searchName, List<String> searchIds) {
if (!StringUtil.isBlank(searchName) && !CollectionUtil.isEmpty(searchIds)) {
StringBuffer retStr = new StringBuffer();
for(int i = 0; i < searchIds.size(); ++i) {
if (i % 1000 == 0) {
if (i == 0) {
retStr.append(searchName).append(" in (");
} else {
retStr.append(") or ").append(searchName).append(" in (");
}
} else {
retStr.append(" , ");
}
retStr.append("'").append((String)searchIds.get(i)).append("'");
}
retStr.append(")");
return retStr.toString();
} else {
return "";
}
}
/**
* 下划线转驼峰
* @param str
* @return
*/
public static String lineToHump(String str){
str = str.toLowerCase();
Matcher matcher = linePattern.matcher(str);
StringBuffer sb = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* 获取四舍五入
* @param value
* @return
*/
public static String roundHalfUp(double value, int scaleNum) {
String formatStr = addZeroForNum("0.", (scaleNum+2));
DecimalFormat df = new DecimalFormat(formatStr);
double result = new BigDecimal(String.valueOf(value)).setScale(scaleNum, BigDecimal.ROUND_HALF_UP).doubleValue();
return df.format(result);
}
public static String addZeroForNum(String str, int strLength) {
int strLen = str.length();
StringBuffer sb = null;
while (strLen < strLength) {
sb = new StringBuffer();
sb.append(str).append("0");//右补0
str = sb.toString();
strLen = str.length();
}
return str;
}
public static Object setFieldValueByFieldName(Object o, String fieldName, Object fieldValue) {
try {
Field f = o.getClass().getDeclaredField(fieldName);
f.setAccessible(true);
try {
f.set(o, fieldValue);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return o;
}
/**
* 根据属性名获取属性值
*
* @param fieldName
* @param object
* @return
*/
public static Object getFieldValueByFieldName(String fieldName, Object object) {
try {
Field field = object.getClass().getDeclaredField(fieldName);
//设置对象的访问权限,保证对private的属性的访问
field.setAccessible(true);
return field.get(object);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static Map<String, Object> objectToMap(Object obj) throws Exception {
if(obj == null){
return null;
}
Map<String, Object> map = new HashMap<String, Object>();
Field[] declaredFields = obj.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
map.put(field.getName(), field.get(obj));
}
return map;
}
public static void main(String[] args) {
System.out.println(roundHalfUp(0.2000606, 6));
}
}
2.通过对象属性反射给对象赋值
public static Object initObjects(Object obj,ResultSet rs) {
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i <fields.length ; i++) {
// 取消属性的访问权限控制,即使private属性也可以进行访问。
fields[i].setAccessible(true);
String fieldName = fields[i].getName();
//转大写
String biColumNameString = fieldName.toUpperCase();
String columValue;
try {
columValue = rs.getObject(biColumNameString) != null ? rs.getObject(biColumNameString).toString() : "";
fields[i].set(obj, columValue);
} catch (IllegalAccessException e) {
e.printStackTrace();
}catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return obj;
}
java反射机制实例的更多相关文章
- Java反射机制实例解析
1.获取想操作的访问类的java.lang.Class类的对象 2.调用Class对象的方法返回访问类的方法和属性信息 3.使用反射API来操作 每个类被加载后,系统会为该类 ...
- [转]Java反射机制详解
目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...
- 【转载】Java反射机制详解
转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对 ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- java反射机制简单实例
目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...
- Java知识总结:Java反射机制(用实例理解)
概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
随机推荐
- bash常用指令(未完)
#号注释1.man 2.cd 3.clear 4.alias 命令别名设置 区别命令别名和变量的区别,别名可以直接执行,本质是一个函数的索引 5.grep 查找字符串 grep [-acinv] [- ...
- C# 并行循环
Parallel.For(); Paralle.ForEach() 异步编程模式
- CVE-2019-0797漏洞:Windows操作系统中的新零日在攻击中被利用
https://securelist.com/cve-2019-0797-zero-day-vulnerability/89885/ 前言 在2019年2月,卡巴实验室的自动漏洞防护(AEP)系统检测 ...
- 关于iwinfo的调试
在调试 主动扫描时,调用命令 “iwinfo wlan0 scan”时, 在iwinfo中添加的调试语句没有打印和记录到log中去. 后查看iwinfo的makefile发现,在生成iwinfo程序 ...
- ubuntu安装Qt
一.安装 卸载旧版本Qt,找到安装目录,例如:/home/likewei/Qt5.11.2,终端输入命令进入该目录,输入命令:./MaintenanceTool 进入图形画面卸载就行了 1. ...
- 通过python生成nginx模板配置文件
通过python生成nginx模板配置文件 # cat config.py #coding=utf-8 nginx_conf = ''' server {{ listen {port}; server ...
- 生产环境elasticsearch5.0报错IllegalArgumentException: number of documents in the index cannot exceed 2147483519的处理
最近几天的push:user:req数据写不到集群,报错如下: [--13T09::,][DEBUG][o.e.a.b.TransportShardBulkAction] [yunva_etl_es8 ...
- Golang -- Signal处理
我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出.我们采用系统Signal来 通知系统退出,即kill pragram-pid.我们 ...
- Sq lServer触发器的使用
创建表: CREATE TABLE [dbo].[GeneralRule]( [ID] [int] NOT NULL, ) NULL, [DeleteFlag] [int] NOT NULL ) CR ...
- backtrace和backtrace_symbols
一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的. 在glibc ...