上一章节说了反射中学习到的知识,现在通过实践来写一个动态创建类,以及获取动态设值的方法
public class ReflectProUtils { /** * 获取泛型中的类型 * 例如: List<String> 获取出的类型为 [String.class] * 说明: * 需要获取泛型的,必须通过继承等方式重新构建一个新类,传递泛型的类型 * * 可查考 * @throws ClassNotFoundException * @see BaseMapper * */ @SuppressWarnings("rawtypes") public static List<Class> getGenericsClass(Class thisClass) throws ClassNotFoundException{ //返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。 Type genType = thisClass.getGenericSuperclass(); List<Class> list= new ArrayList<Class>(); if (!(genType instanceof ParameterizedType)) { list.add(Object.class); return list; } //返回表示此类型实际类型参数的Type对象的数组 Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); for(Type type : params){ list.add( type2Class(type) ); } return list; } /** * Type类型转换为Class类型 * */ public static Class type2Class(Type type) throws ClassNotFoundException{ String clsStr = type.toString(); String classStrPath = clsStr.substring(clsStr.indexOf(" ")+1 , clsStr.length()); if(int.class.getName().equals(classStrPath)) return int.class; else if(Constants.BYTE_NAME.equals(classStrPath)) return byte.class; else if(Constants.SHORT_NAME.equals(classStrPath)) return short.class; else if(Constants.LONG_NAME.equals(classStrPath)) return long.class; else if(Constants.FLOAT_NAME.equals(classStrPath)) return float.class; else if(Constants.DOUBLE_NAME.endsWith(classStrPath)) return double.class; else if(Constants.CHAR_NAME.equals(classStrPath)) return char.class; else if(Constants.BOOLEAN_NAME.equals(classStrPath)) return boolean.class; return Class.forName(classStrPath); } /** * 获取类中的所有字段,包括私有字段 * @param Class * @return {@link Field} * */ @SuppressWarnings("rawtypes") public static Field[] getAllFields(Class cls){ return cls.getDeclaredFields(); } /** * 只获取类中的公共方法,被public修饰的方法 * @param Class * @return {@link Field} * */ @SuppressWarnings("rawtypes") public static Field[] getPublicFields(Class cls){ return cls.getFields(); } /** * 获取当前类下的所有get/set方法 * @param Class * @return {@link Map} <方法名,方法> * */ @SuppressWarnings("rawtypes") public static Map<String,Method> getAllGSMethods(Class cls){ Map<String,Method> getSetMethodMap = new HashMap<String,Method>(); Method[] methods = cls.getDeclaredMethods(); for(Method method : methods){ String name = method.getName(); if(name.contains("get") || name.contains("set")) getSetMethodMap.put(name, method); } return getSetMethodMap; } /** * 获取所有的方法 * @param cls * @return {@link Method} * */ @SuppressWarnings("rawtypes") public static Method[] getAllMethods(Class cls){ return cls.getDeclaredMethods(); } /** * 只获取公开的方法 * @param cls * @return {@link Method} * */ @SuppressWarnings("rawtypes") public static Method[] getPublicMethods(Class cls){ return cls.getMethods(); } /** * 为对象执行set方法,进行赋值 * set_T_Properties_value * * @param fields 对象中的字段 * @param getSetMap get/set方法 * @param T 需要赋值的对象 * @param args 参数 * @throws Exception * */ public static void setTProVal(Field field ,Object T,Object arg) throws Exception{ String name = field.getName(); try { Method method = T.getClass().getMethod( "set" + StringUtil.toUpperCaseFirstOne(name), arg.getClass()); if(method != null){ method.invoke(T, arg); } } catch (NoSuchMethodException e) { System.out.println("找不到对应参数类型的方法..请核对方法名和类型"); } } public static <T>void setTProVal(T bean,Map<String,T> param) throws Exception{ Field[] fields = getAllFields(bean.getClass()); for(Field field : fields){ field.setAccessible(true); String name = field.getName(); Object val = param.get(name); if(val != null){ setTProVal(field, bean, val); } } } /** * 获取一个对象下面的字段对应的数据 * @param Field 字段 * @param obj 对象 * @throws Exception * */ public static <T>Object getTProVal(Field field,T obj ) throws Exception{ String name = field.getName(); try { Method method = obj.getClass().getMethod("get"+StringUtil.toUpperCaseFirstOne(name)); if(method != null){ return method.invoke(obj, null); } } catch (NoSuchMethodException e) { System.out.println("找不到对应参数类型的方法..请核对方法名和类型"); } return null; } /** * 获取Field的类型 * @return * @throws ClassNotFoundException * */ public static Class getFieldType(Field field) throws ClassNotFoundException{ return type2Class(field.getType()); } /** * 判断某个类下是否有某个方法存在 * @param Class * @param 方法名 * */ public static boolean hasMethod(Class cls , String methodName){ Map<String,Method> methodMap = getAllGSMethods(cls); if(methodMap == null) return false; else{ Method method = methodMap.get(methodName); return method != null ? true :false; } } public static void main(String[] args) throws ClassNotFoundException { System.out.println(int.class.getName()); } }
相关推荐
"IDEA插件之GET/SET自动生成带模版注释插件"是一个专为IDEA设计的插件,它扩展了IDEA原有的get/set生成功能,允许开发者在生成的get/set方法中加入特定的注释模板。这与MyEclipse的Code Templates功能类似,都旨在...
4.2 CRUD操作:通过Session的save()、update()、delete()和get()、load()方法实现对数据库的增删改查。 4.3 查询语言HQL:Hibernate Query Language是Hibernate提供的面向对象的查询语言,类似于SQL但更面向对象。 ...
在本视频教程“黑马程序员_毕向东_Java基础视频教程第22天-06-GUI(Action事件)”中,讲师毕向东深入讲解了Java GUI中的Action事件处理机制,这是构建用户友好界面的关键部分。 首先,我们要理解什么是GUI。GUI,...
void sha256_get(uint8_t hash[32], const uint8_t *message, int length);/*此函数用于对消息计算摘要值,输入任意大小消息,输出32字节摘要值*/ void hmac_sha256_get(uint8_t digest[32], uint8_t *message, int...
java版的SNMP_get,SNMP_walk,SNMP_getbulk,详细举例代码完整版!!
Eclipse版本Version: Oxygen.3a Release (4.7.3a),修改了GetterSetterUtil.class之后的jar包,能自动添加getter和setter方法注释
lr_set_transaction_instance_status/设置事务实例的状态 lr_set_transaction_status/设置打开事务的状态 lr_set_transaction_status_by_name/设置事务的状态 lr_start_sub_transaction/标记子事务的开始 lr_start_...
一种基于FPGA的UPP接口代码实现connect_debug_port u_ila_0/probe45 [get_nets [list tx2_lock]] create_debug_port u_ila_0 probe set_property PROBE_TYPE DATA_AND_TRIGGER [get_debug_ports u_ila_0/probe46] ...
### Java反射创建get set方法及反射方法的调用 #### 概述 在Java编程语言中,反射(Reflection)是一种强大的技术,它允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。本文将...
eclipse 的GET/SET对字段的注释自动添加
把下载的jar包放在 Maven仓库的 org\mybatis\generator\mybatis-generator-core\1.3.5 下面即可,然后在generatorConfig配置文件中加上 <property name="hasLombok" value="true"/> </plugin> 即可
在实际应用中,`snmp_Get_Set_Trap`工具通常配合脚本语言(如Python、Perl或Bash)和任务调度器(如Cron)使用,以实现自动化监控和管理任务。例如,你可以定期通过GET检查设备状态,通过SET执行配置变更,或者设定...
smnp get/set方法 target PDU.GETBULK request.add(new VariableBinding(new OID("1.3.6.1.2.1.10000.3.1"))); ResponseEvent responseEvent = snmp.send(request, target); 相应的注释 请参照 注释 修改...
博文Unity-Get/Set属性访问器详解源码!!!!!!!!!!
首先,打开Idea,然后在类中选中或输入需要生成get/set方法的属性。接着,可以通过以下几种方式触发代码生成: 1. 使用快捷键:在Windows/Linux系统中,可以按下`Alt + Insert`;在Mac系统中,使用`Command + N`。 2...
在Java编程中,Eclipse是一款广泛使用的集成开发环境(IDE),它提供了许多便捷的功能,其中之一就是自动生成get和set方法。这些方法是面向对象编程中常见的数据访问接口,用于封装类的私有属性。当我们创建一个类并...
public static String REQUEST_METHOD_GET = "GET"; // 媒体类型 public static String MIME_TYPE_FORM = "application/x-www-form-urlencoded;charset=utf-8"; public static String MIME_TYPE_XML = ...