原创

JAVA注解实现业务逻辑原理介绍

1.注解介绍

跳到php注解实现

  1. ....我不喜欢 cv 官方介绍啥的,没啥意思,都用自己的实际经验和想法写好了,希望可以达到通俗易懂的效果
  2. 我就根据我自己做的利用ASM解析jar包信息,并根据jar中注解实现我砖厂某个自动化的功能 写一下这个文章
  3. 只写核心思路代码
  4. 在java中注解本质是一个接口,如下就是一个自定义注解

     @Target({ElementType.METHOD,ElementType.TYPE})
     @Retention(RetentionPolicy.RUNTIME)
     public @interface JtfBeanInfo {
    
         String value() default "";
    
     }
    
  5. java.lang.annotation.Annotation 本身是接口,而不是注解,当使用关键字@interface 定义一个注解时,该注解隐含的继承了java.lang.annotation.Annotation接口;

2.java注解使用

1. java中classLoad读取判断注解的方式

  1. 利用classLoad ,Class<?> myClass = myClassLoader.loadClass(classFile);
  2. 此时可以根据myClass对象中 方法判断类级别是否存在某个注解myClazz.isAnnotationPresent(JtfBeanBind.class);
  3. 能判断是都存在注解之后,就可以继续获取注解的属性值,然后进行你的业务逻辑

2.ASM字节码框架读取判断注解方式

URL url = new URL("jar:file:" + jarFile + "!/" + packName);
JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
is = jarConnection.getInputStream();
try {
            "构造ASM ClassReader对象"
            ClassReader cr = new ClassReader(is);
            "对象cn是一个树结构的对象,这个jar包里面所有的类信息,注解信息,父类信息,类方方法。类方法注解等等所有的信息"
            ClassNode cn = new ClassNode();
            cr.accept(cn, ClassReader.EXPAND_FRAMES);
            List<AnnotationNode> visibleAnnotations = cn.visibleAnnotations;
            "所有的方法节点"
            List<MethodNode> methods = cn.methods;
            for (int i = 0; i < methods.size(); ++i) {
                MethodNode method = methods.get(i);
                "获取类方法注解list"
                List visibleAnnotations = method.visibleAnnotations;
                for (int i=0; i< visibleAnnotations.size();i++) {
                    if(((AnnotationNode) visibleAnnotations.get(i)).desc.indexOf("JtfBeanInfo") != -1){
                        "判断次方法是否有JtfBeanInfo注解有则进行实际的业务处理,可以是加日志等等 这里就是实际的注解发挥作用的地方了"
                    }
                }
            }
            .........
  1. 从上面的逻辑就能看出来 注解是如何发挥逻辑功能的
  2. 主要根据反射获取目标的注解信息,来进行业务判断,还可以获取注解的属性值,来对方法对象赋值业务改变等等吧怎么搞都行了
"classLoad方式获取某方法注解"
JtfServiceID sa = declaredMethod.getAnnotation(JtfServiceID.class);
        if(sa == null ){
            return;
        }
        "获取次方法注解的value值和assignMajor值,并赋值给对象methodEntity"
        methodEntity.setPointName(sa.value());
        methodEntity.setAssignMajor(sa.assignMajor());

3.总结

1.java中主要是根据反射解析达到
2.判断是否存在某个注解
3.获取注解的属性值
4.利用asm字节码框架动态生成或者改变已经存在的类 达到实现某个业务功能的目的
5.大概思路就这样,使用和定义一个注解都特别简单

3.php实现注解

1.我觉得 万变不离其宗,php实现注解应该也是大体思路吧,虽然php目前不支持注解,需要根据注释实现
2.如果真的php必要支持注解那就看polarphp和Swoole2位大佬的项目了
3.我觉得注解是一个减少代码侵入和减少开发的一种方式等等好处,领会要领即可,没必要死扣注解二字,php完全可以起一个其他名字来实现比如xxx.dasd等等名字
3.来一个最简单,强调是最简单php实现注解的代码,只是想表达所谓注解的实现思路

<?php
class home{
      /**
       * [Ann]needLog[/Ann]
       */
    public function userInfo(){

    }
}
//php在路由中使用,获取URI, $c, $m
$c='home';$m='userInfo';//假数据应该根据 uri赋值
$rc = new ReflectionClass($c);
$rm = $rc->getMethod($m);
$dc = $rm->getDocComment();
$ann=null;
preg_match('/\[Ann\](.*)\[\/Ann\]/i', $dc, $ann);
if($ann[1] == 'needLog'){
    //如果注解中需要日志则写日志即可
    file_put_contents('./log.txt', time()."调用{$c}中的${m}",FILE_APPEND);
}
  1. 这样php就实现了最简单的注解功能
  2. 凡是带有[Ann]needLog[/Ann] 注释的方法就会记录一个此方法调用时间

希望可以对想了解所谓注解的同学 有所帮助

正文到此结束
本文目录