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"));
}
}
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- ProxyFactory是创建代理类的工厂接口,其中的setProperties方法用来对工厂进行属性设置,但是mybatis内置的两个实现
- 在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,
- 一个简单的实现版本,没有去Hook键鼠等操作,事先录制好操作步骤(将鼠标移动到需要操作的位置,按下热键执行相应动作),点击运行即可。主要还是
- JDK * ,代理接口没有实现类,实现 * JDK代理,代理的是接口,那么笔者想一想,既然代理的是接口,那如果没有实现类怎么办,能不能代
- jasperreport导出的pdf每页显示的记录太少主要是确保Details的高度与Details中Field Text的高度一致。jas
- 在没介绍正文之前,先给大家介绍下websocket的背景和原理:背景在浏览器中通过http仅能实现单向的通信,comet可以一定程度上模拟双
- 本文实例讲述了Java String类简单用法。分享给大家供大家参考,具体如下:一 String类的实例化方式1 代码public clas
- java String的深入理解一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和
- 前言 Windows下实现摄像视频捕捉有多种实现方式;各种方式的优劣,本文不做对比。但是,opencv是一款老牌开发库,在图像处理
- 面向接口编程接口的定义及功能这里从java介入吧,在java中,接口是一种特殊的类,接口里面的量都是常量,接口的方法只有定义而没有实现,换句
- 本文实例为大家分享了java实现捕鱼达人游戏的具体代码,供大家参考,具体内容如下效果图如下:源代码分享:测试类:package game;i
- 如下所示:String.valueOf((char)10)在导出excel 的时候,如果原始文字中含有 \n 字符, 如果把 \n 替换为&
- Intellij Idea打包Java项目打开模块设置如下图所示,选中需要打包的模块,右键点击,即会出现如下图所示的内容,点击Open Mo
- 一、 通过JDK网络类Java.net.HttpURLConnection1.java.net包下的原生java api提供的http请求使
- 嵌套查询使用Fluent Mybatis, 不用手写一行xml文件或者Mapper文件,在dao类中即可使用java api构造中比较复杂的
- 现在有一张订单表t_stockorder,其拥有id、code、client_id、merchandise_id、merchandise_n
- 开发环境: IDEA 2022.1.41. 概述虽然webservice这块使用很少,但在局域网作服务还是相当不错。今天突生想法,想做一个来
- 单行文本的输入存在严重的缺陷,也不适合实际的运用,本节通过一个无功能的记事本来介绍可以进行多行输入的JTextArea:JTextArea(
- mybatis自动生成实体类、mapper文件、mapper.xml文件若采用mybatis框架,数据库新建表,手动编写的话,需要编写大量的
- 创建类的对象 = 类的实例化 = 实例化类类和对象的使用(面向对象思想落地的实现):1.创建类,设计类的成员2.创建类的对象3.通过“对象.