好玩的注解和反射

原文地址:http://blog.csdn.net/BingHongChaZuoAn/article/details/52045292
不知道为啥,老觉得注解和反射挺好玩的,以前会写,但是不是玩,没深度,没意思,这次好好没玩一哈。
看下面代码:

注解MM,这是一个方法注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MM {

    String name() default "cooci";
    int age() default 24;
    int order() default 0;
}

注解Boy,这是一个变量注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Boy {
   String name () default "";
}

注解主要类

public class TestMM {

    @Boy(name = "西门庆")
    private String boy1;

    @Boy(name = "武大郎")
    private String boy2;

    @MM(name = "潘金莲",order = 1)
    private void moMM(String boyName, String mmName) {
        Log.v("invoke", "--------" + boyName + "摸了" + mmName + "一下---------");
    }

    @MM(name = "潘金莲",order = 2)
    private void mmSay(String boyName, String mmName) {
        if (boyName.equals("西门庆")) {
            Log.v("invoke", "----"+mmName+"说----流氓!-----");
        }else if(boyName.equals("武大郎")){
            Log.v("invoke", "----"+mmName+"说----滚!-----");
        }
    }

    public String getBoy1() {
        return boy1;
    }

    public String getBoy2() {
        return boy2;
    }
}

注解辅助类

 class MethodHold {
        private Method method;
        private MM mm;

        public MethodHold() {
        }

        public MethodHold(Method method, MM mm) {
            this.method = method;
            this.mm = mm;
        }

        public Method getMethod() {
            return method;
        }

        public void setMethod(Method method) {
            this.method = method;
        }

        public MM getMm() {
            return mm;
        }

        public void setMm(MM mm) {
            this.mm = mm;
        }
    }

测试类

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                testStudentInvoke();
//                testAppleInvoke();
                testMM();

            }
        });

    }

    private void testMM() {
        Class<?> cls = TestMM.class;
        try {

            TestMM testMM = (TestMM) cls.newInstance();

            Field fields[] = cls.getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(Boy.class)) {
                    Boy boy = field.getAnnotation(Boy.class);
                    field.setAccessible(true);
                    field.set(testMM, boy.name());
                }
            }
            Log.v("invoke", "--------boy1-------------->" + testMM.getBoy1());
            Log.v("invoke", "--------boy2-------------->" + testMM.getBoy2());

            Method methods[] = cls.getDeclaredMethods();
            ArrayList<MethodHold> arrayList = new ArrayList<>();
            for (Method method : methods) {
                if (method.isAnnotationPresent(MM.class)) {
                    MM mm = method.getAnnotation(MM.class);
                    method.setAccessible(true);
                    arrayList.add(new MethodHold(method, mm));
                }
            }

            arrayList = sortMethodByOrder(arrayList);
            for (MethodHold methodHold : arrayList) {
                methodHold.getMethod().invoke(testMM, testMM.getBoy1(), methodHold.getMm().name());
            }

            for (MethodHold methodHold : arrayList) {
                methodHold.getMethod().invoke(testMM, testMM.getBoy2(), methodHold.getMm().name());
            }


        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }

    /**
     *标准冒泡排序
     */
    private ArrayList<MethodHold> sortMethodByOrder(ArrayList<MethodHold> arrayList) {

        for (int i = 0; i < arrayList.size() - 1; i++) {
            boolean flag = true;
            for (int j = 0; j < arrayList.size() - i - 1; j++) {
                MethodHold preMethodHold = arrayList.get(j);
                MethodHold aftermethodHold = arrayList.get(j + 1);
                if (preMethodHold.getMm().order() > aftermethodHold.getMm().order()) {
                    arrayList.remove(j);
                    arrayList.add(j + 1, preMethodHold);
                    flag = false;
                }
            }

            if (flag) {
                break;
            }
        }
        return arrayList;
    }
    }

就此搞定,看打印的结果:

invoke: --------boy1-------------->西门庆
invoke: --------boy2-------------->武大郎
invoke: --------西门庆摸了潘金莲一下---------
invoke: ----潘金莲说----流氓!-----
invoke: --------武大郎摸了潘金莲一下---------
invoke: ----潘金莲说----滚!-----

好了 ,好玩吧 哈哈,你也试试

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值