java 反射机制初学习

百度百科解释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();


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值