自我学习之反射机制

1.JAVA反射机制

反射的运用场景:
1.如果多个类对象中有相同方法和属性需要进行相同处理的时候,最方便的方法就是运用反射的原理来进行公共代码的编写,不需要每个类都写一个方法。
2.类中的私有方法和私有属性咱是无法访问的,但是使用反射就可以获取类中的私有方法、属性。

反射的使用方法

不同的对象进入公共方法

Class clz = String.class;

如果获取到的是对象全称的集合,例如:java.lang.String

Class clz = Class.forName("java.lang.String");

反射出来的clz就可以获取到方法,字段,构造函数等。(本文只记录这三种方式)

Method[] methods = 	clz.getMethods();//获取反射实例中的public方法
//clz.getDeclaredMethods()//获取所有方法
for (Method method : methods) {
	System.out.println(method.toString());
}
Constructor<?>[] constructors = clz.getConstructors();
//获取反射实例中的所有public构造方法
//clz.getDeclaredConstructors(); 获取所有构造方法
for (Constructor<?> constructor : constructors) {
	System.out.println(constructor.toString());
}
clz.getMethods("indexOf",";".getClass());//获取指定的方法,只能获取public
//private , protected获取不到
//getDeclaredMethods(object,Class ... paramters) 获取指定方法,所有权限都可以获取到
clz.getField("hash");//会提示获取不到hash,因为hash为private
//getDeclaredField("hash") 就可以获取到 

以上代码需要注意的是,引用方法或者字段的时候,需要看看有没有Declared这个单词,有它在的时候,你才能取得所有的方法和字段哦!~

当然还有获取反射实例上的所有注解getAnnotations()、getDeclaredAnnotations()

此时,若有个需求,需要根据你的实体类中的所有的字段,生成对应的数据表结构,那么要怎么做呢?

void method(){
Field[] fs = clz.getDeclaredFields();//这就获取到所有的字段了,包括private和protected
for(Field f : fs){
String name = f.getName();//这就获取到了字段名称
String tname = f.getType().getName();//这就获取到了字段类型的名称如:java.lang.String
}
}

详细的可以去看看我的另一篇文章:
Java实体类反射配合自定义注解自动生成数据库表

下面简单例子:
背景为数据库查询出entity,根据传递的参数,动态获取数据,并合并成map

public static <T> T entityToMap(List<? extends T> t,List<String> params){
		List<Map> rList = new ArrayList<Map>();
		for (T obj : t) {
			Class clz = obj.getClass();
			int length = args.size();
			while(true) {
				Map<String,Object> map = new HashMap<String, Object>();
				for (String arg : args) {
					try {
						//如果方法驼峰显示
						char prefix = arg.toUpperCase().charAt(0);
						String suffix = arg.substring(1);
						String methodName = prefix + suffix;
						//invoke执行反射出的方法
						//invoke(Object obj , Object ... args)
						Object rObj = clz.getMethod("get"+methodName).invoke(obj);
						if(rObj instanceof Date) {
							rObj = DateUtil.convertDateToString((Date)rObj, "yyyy-MM-dd HH:mm");
						}
						map.put(arg, rObj);
					} catch (Exception e) {
						e.printStackTrace();
					}
					length--;
				}
				rList.add(map);
				if(length<=0) {
					break;
				}
			}
		}
		return rList;
}

先记录到此,后续学习较深入,再来补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值