`
qq272936993
  • 浏览: 3209 次
社区版块
存档分类
最新评论

黑马程序员_反射之get/set工具类的实现

阅读更多

上一章节说了反射中学习到的知识,现在通过实践来写一个动态创建类,以及获取动态设值的方法

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插件之GET/SET自动生成带模版注释插件"是一个专为IDEA设计的插件,它扩展了IDEA原有的get/set生成功能,允许开发者在生成的get/set方法中加入特定的注释模板。这与MyEclipse的Code Templates功能类似,都旨在...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4

    4.2 CRUD操作:通过Session的save()、update()、delete()和get()、load()方法实现对数据库的增删改查。 4.3 查询语言HQL:Hibernate Query Language是Hibernate提供的面向对象的查询语言,类似于SQL但更面向对象。 ...

    黑马程序员_毕向东_Java基础视频教程第22天-06-GUI(Action事件).zip

    在本视频教程“黑马程序员_毕向东_Java基础视频教程第22天-06-GUI(Action事件)”中,讲师毕向东深入讲解了Java GUI中的Action事件处理机制,这是构建用户友好界面的关键部分。 首先,我们要理解什么是GUI。GUI,...

    SHA256 摘要算法 、HMAC_SHA256 散列/哈希算法 C语言实现,适应于各种嵌入式单片机

    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/walk/getbulk

    java版的SNMP_get,SNMP_walk,SNMP_getbulk,详细举例代码完整版!!

    eclipse get/set自动添加属性注释的插件

    Eclipse版本Version: Oxygen.3a Release (4.7.3a),修改了GetterSetterUtil.class之后的jar包,能自动添加getter和setter方法注释

    loadRunner常用脚本

    lr_set_transaction_instance_status/设置事务实例的状态 lr_set_transaction_status/设置打开事务的状态 lr_set_transaction_status_by_name/设置事务的状态 lr_start_sub_transaction/标记子事务的开始 lr_start_...

    UPP接口双向通信功能

    一种基于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反射创建get set方法及反射方法的调用 #### 概述 在Java编程语言中,反射(Reflection)是一种强大的技术,它允许程序在运行时检查类、接口、字段和方法的信息,并能够动态地创建对象和调用方法。本文将...

    eclipse get/set 自动添加注

    eclipse 的GET/SET对字段的注释自动添加

    MyBatis-Generator 自动生成Lombok标签 不生成Get/Set方法

    把下载的jar包放在 Maven仓库的 org\mybatis\generator\mybatis-generator-core\1.3.5 下面即可,然后在generatorConfig配置文件中加上 &lt;property name="hasLombok" value="true"/&gt; &lt;/plugin&gt; 即可

    snmp_Get_Set_Trap工具

    在实际应用中,`snmp_Get_Set_Trap`工具通常配合脚本语言(如Python、Perl或Bash)和任务调度器(如Cron)使用,以实现自动化监控和管理任务。例如,你可以定期通过GET检查设备状态,通过SET执行配置变更,或者设定...

    SNMP 例子 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,详解源码

    博文Unity-Get/Set属性访问器详解源码!!!!!!!!!!

    idea生成带注释的get/set方法插件

    首先,打开Idea,然后在类中选中或输入需要生成get/set方法的属性。接着,可以通过以下几种方式触发代码生成: 1. 使用快捷键:在Windows/Linux系统中,可以按下`Alt + Insert`;在Mac系统中,使用`Command + N`。 2...

    Eclipse get/set方法 自动加上字段注释

    在Java编程中,Eclipse是一款广泛使用的集成开发环境(IDE),它提供了许多便捷的功能,其中之一就是自动生成get和set方法。这些方法是面向对象编程中常见的数据访问接口,用于封装类的私有属性。当我们创建一个类并...

    http/https请求工具类

    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 = ...

Global site tag (gtag.js) - Google Analytics