java反射技术与类使用示例
发布时间:2021-09-14 06:34:34
package com.java.db;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.java.entity.BookShelf;
import com.java.util.GetMetaDataCloumName;
public class GetNewInstances<T> {
Class[] cl = {};
Object[] ob = {};
/**
* 每次用完之后设为空 不然会累加
*/
public void setNullToArrays(){
this.cl = new Class[]{};
this.ob = new Object[]{};
}
/**
* copy Object数组
*
* @param obj
* 构造方法里需要的实际值
* @return
*/
public Object[] getObjectArrays(Object obj) {
ob = Arrays.copyOf(ob,ob.length + 1);
ob[ob.length - 1] = obj;
return ob;
}
/**
* copy Class 数组
*
* @param cla
* 要添加的class
*
* @return
*/
@SuppressWarnings("unchecked")
public Class[] getClassArrays(Class<?> cla) {
if (cla != null) {
cl = Arrays.copyOf(cl,cl.length + 1);
cl[cl.length - 1] = cla;
return cl;
}else{
return cl;
}
}
/**
* 得到类的实例
*
* @param clazz
* 要实例化的类
* @return 实例化之后的类
* @throws InstantiationException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws SecurityException
* @throws InvocationTargetException
* @throws NoSuchMethodException
*/
@SuppressWarnings("unchecked")
public Object getClassNewInstance(Class<?> clazz)
throws InstantiationException, IllegalAccessException,
IllegalArgumentException, SecurityException,
InvocationTargetException, NoSuchMethodException {
Object oj = null;
Constructor[] cons = clazz.getDeclaredConstructors();// 得到构造函数
Class[] cla = cons[1].getParameterTypes();
System.out.println("提示用户是否需要添加字段 构造函数参数的大小:"+cla.length);
for (int i = 0; i < cla.length; i++) {
String classStr = cla[i].toString();
// System.out.println("参数的类型:"+classStr);
if (classStr.equals("class java.lang.String")) {
getClassArrays(String.class);
} else if (classStr.equals("int")) {
getClassArrays(int.class);
} else if (classStr.equals("double")) {
getClassArrays(double.class);
} else if (classStr.equals("boolean")) {
getClassArrays(boolean.class);
} else if (classStr.equals("float")) {
getClassArrays(float.class);
} else if (classStr.equals("class java.lang.Integer")) {
getClassArrays(Integer.class);
}else if(classStr.equals("class java.lang.Float")){
getClassArrays(Float.class);
}
}
oj = clazz.newInstance();//返回当前对象 具体的实例化构造在BDOperater
return oj;
}
/**
* 通过构造函数得到具体的实例类
* @param clazz
* @return
* @throws IllegalArgumentException
* @throws SecurityException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws NoSuchMethodException
*/
public Object getObjCon(Class<?> clazz) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
Object obj=null;
obj = this.getClassNewInstance(clazz);
return obj;
}
/**
* 得到对象的实例
* @param clazz
* @return
* @throws InstantiationException
* @throws IllegalAccessException
*/
public Object getNewinstance(Class clazz) throws InstantiationException, IllegalAccessException{
Object obj = null;
obj = clazz.newInstance();
return obj;
}
/**
* 根据反射得到类中的所有属性
* @param clazz 需要被获取属性的类
* @return 属性集合
* @throws SecurityException
* @throws IllegalArgumentException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws NoSuchMethodException
*/
public Field[] getFielsdArray(Class<Object> clazz) throws SecurityException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
Field[] fields = null;
fields = clazz.getDeclaredFields();
return fields;
}
/**
* 根据字符串得到setter格式的属性
* @param str 需要格式化的属性
* @return
*/
public String getSetterStr(String str){
String info = null;
String strValue = str.substring(0,1).toUpperCase();
info = "set"+strValue+str.substring(1,str.length());
return info;
}
/**
* 把setXX还原为XX
* @param str
* @return
*/
public String setSetStr(String str){
String info = null;
String strValue = str.substring(3,str.length());
String lower = strValue.substring(0).toLowerCase().substring(0,1);
info = lower+str.substring(4,str.length());
return info;
}
/**
* 得到类中的方法
* @param clazz 需要的得到方法的类
* @return
*/
public Method[] getMethodsArray(Class clazz){
Method[] methods = clazz.getMethods();
return methods;
}
/**
* 根据list<map>实例化构造函数
* @param listMap
* @param clazz
* @param tableName 数据库名称
* @return
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws SecurityException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InstantiationException
*/
@SuppressWarnings({ "unchecked" })
public List<Object> getListByMap(List<Map<String,Object>> listMap,Class clazz,String tableName) throws InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException{
List<Object> listLast = new ArrayList<Object>();
List<String> metaList = GetMetaDataCloumName.getCloumNameList(tableName);
Iterator<Map<String,Object>> it = listMap.iterator();
while(it.hasNext()){
Map<String,Object> map = it.next();
Iterator<String> iitt = metaList.iterator();
while(iitt.hasNext()){
String info = iitt.next();
this.getObjectArrays(map.get(info));
}
System.out.println("调用反射:"+this.cl.length+" "+this.ob.length);
Object Tobj = this.getClassNewInstance(clazz).getClass().getConstructor(this.cl).newInstance(this.ob);
listLast.add(Tobj);
this.setNullToArrays();
}
return listLast;
}
public static void main(String[] args) {
GetNewInstances ge = new GetNewInstances();
System.out.println(ge.getSetterStr("nameSpace")=="setNameSpace");
System.out.println("1a"=="1a");
System.out.println(ge.setSetStr("setNameSpace"));
}
}


猜你喜欢
- 0x00 前言在一些比较极端情况下,C3P0链的使用还是挺频繁的。0x01 利用方式利用方式在C3P0中有三种利用方式http baseJN
- 本文实例为大家分享了shader实现基于世界坐标的贴图置换效果。效果如下:设置面板如下:可在面板上设置切换方向,与切换对象,及其切换速度。s
- 本文通过实例详细阐述了C++关于智能指针的概念及用法,有助于读者加深对智能指针的理解。详情如下:一、简介由于 C++ 语言没有自动内存回收机
- Xamarin写Android程序时,通常要使用按中文首字母分组显示(如通讯录) 。于是需要被迫包含CJK,不过包含后包肯定是会变大的,于是
- 本文实例讲述了Asp.net中C#使用Socket发送和接收TCP数据的方法,分享给大家供大家参考。具体实现方法如下:具体程序代码如下:us
- 需求描述 今日需求是删除资源时同时删除与该资源绑定的角色数据,有两张表,资源表、
- 其实这个比较简单,子线程怎么通知主线程,就是让子线程做完了自己的事儿就去干主线程的转回去干主线程的事儿。那么怎么让子线程去做主线程的事儿呢,
- Spring boot项目结合docker容器用,打了个jar包,启动的时候竟然说:no main manifest attribute,
- String password = RandomUtil.generateString(10);源码如下:package com.javan
- 上期回顾上期我们主要介绍了排序的基本认识,以及四个排序,分别是直接插入排序,希尔排序,选择排序,堆排序,从这些排序中,了解了算法的实现,以及
- 1、先使用tiledmap编辑地图,图层用来刷图块,对象用来定义单个格子的数据2、为每个图块调属性 3、图块需要单独配置属性的就必
- 自己整理了 spring boot 结合 Redis 的工具类引入依赖<dependency> <groupI
- 关于这个系列里的问题,每个学Java的人都应该搞懂。当然,若是仅仅学Java玩玩就无所谓了。若是你以为本人现已逾越初学者了,却不很懂这些问题
- 实现目标:使用springMVC前端控制器,跳转到WEB-INF的templates下面的前端页面图示1.目录结构2.创建一个maven的w
- 下边是一些我们常用的正则表达式。自己写的一些正则表达式,可以先在线测评一下。一、校验数字的表达式 1 数字:^[0-9]*$&nb
- 一、Log4net官方网站:https://logging.apache.org/log4net/。下载二进制dll库:包中提供了针对各个版
- 本文主要讲解如何通过RabbitMQ实现定时任务(延时队列)环境准备需要在MQ中进行安装插件 地址链接插件介绍地址:https://www.
- 本系列文章会根据项目的进度进行相关介绍,其会分为多个模块,每个模块互不依赖,各个模块都是单独的学习内容,如sqlite学习模块,contac
- Fragment的产生与介绍Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是
- 一、分步骤集成1.1 整合连接池hikariCP介绍:HikariCP 是一个高性能的 JDBC 连接池组件,可以避免连接频繁建立、关闭的开