百度百科解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简单的解释:通过反射机制可以访问java对象的属性,方法,构造方法等。
闲外话:反射机制对代码精简有很好作用,比如有朋友写了一个Android打印日志的类KyLog,具体理解参考博客。KyLog特性:1.打印类名信息 2.打印方法信息 3.打印json内 4.容打印类的属性值 5.打印数据集合list、map。
之前没有接触过java反射机制,所以一开始接触的时候,想不通,这个KyLog是怎样知道,我现在传给它的类有什么属性呢?要知道有什么属性才知道怎么去获取,然后才能知道怎么打印啊。
不用反射机制的情况下,我们要在Android中打印一个对象entity,就必须知道它有什么属性,然后通过entity去get一个个属性,拼接在一起成为一个String类型,然后Log.i等等打印出来。代码:
String str=entity.get_id()+entity.getAddress()+entity.getCity_id()+entity.getMobile(); Log.i("result",str);打印一两句倒没什么,如果数量大了,重复的工作的确很烦,而且不同的对象,需要get的东西不一样,的确很麻烦。有了反射机制之后,我们就可以写成泛型方法或者泛型类,通过反射机制去得到传给我的类的属性。
通过反射获得类的属性:
private void javaReflectMethod(Class mClass) { //获取所有的属性,包括private属性 ,private的需要权限 field.setAccessible(true); Field[] fields = mClass.getDeclaredFields(); StringBuffer buffer = new StringBuffer(); buffer.append("类:" + mClass); for (Field field : fields) { field.setAccessible(true); buffer.append("\t");//空格 buffer.append(Modifier.toString(field.getModifiers()) + " ");//属性的修饰符 buffer.append(field.getType().getSimpleName() + " ");//属性的类型 buffer.append(field.getName() + ";\n");//属性的名字 } tv.setText(buffer); }效果图:
通过反射加泛型,打印指定对象:
private void init() { tv = (TextView) findViewById(R.id.text); entity = new ActiveJumpEntity(101, "13996893813", "111", "11", "20160409", "小悦悦", "重庆", "重庆", "南岸区", "重庆市南岸区四公里", "类型"); javaReflectMethod(entity); } private <T> void javaReflectMethod(T object) { Class myClass=object.getClass(); //获取所有的属性,包括private属性 ,需要权限 field.setAccessible(true); Field[] fields = myClass.getDeclaredFields(); StringBuffer buffer = new StringBuffer(); buffer.append("类:" + myClass); buffer.append(";\n"); for (Field field : fields) { field.setAccessible(true); String str=field.getName(); Object value=null; try { value = field.get(object); } catch (IllegalAccessException e) { value=e; } buffer.append(field.getName() + ":"+value.toString());//属性的名字 buffer.append(";\n"); } tv.setText(buffer); }效果图:
获取方法,和构造方法
方法关键字
含义
getDeclaredMethods()
获取所有的方法
getReturnType()
获得方法的放回类型
getParameterTypes()
获得方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class,……)
获得特定的方法
构造方法关键字
含义
getDeclaredConstructors()
获取所有的构造方法
getDeclaredConstructor(参数类型.class,……)
获取特定的构造方法
父类和父接口
含义
getSuperclass()
获取某类的父类
getInterfaces()
获取某类实现的接口
Class类中:
1.getName()
一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象
调用该方法会产生奇怪的结果。
2.newInstance()
该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();