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;
}
先记录到此,后续学习较深入,再来补充。