精华内容
下载资源
问答
  • 【Demo 地址】 ... 说明: 此类为本人开发的工具类,具体应用在什么地方呢。...应用场景说明:权限资源自动化生产时,用户点击界面的一键生成资源时,接口中就会遍历指定controller包下所有类,返回所有类名。再...

    【Demo 地址】

    https://github.com/alwaysInRoad/test-annotation-demo.git

    说明:

    此类为本人开发的工具类,具体应用在什么地方呢。本人在实际项目中,权限管理这一块有所应用,应该是权限这一块有所需求而开发的。

    应用场景说明:权限资源自动化生产时,用户点击界面的一键生成资源时,接口中就会遍历指定controller包下所有类,返回所有类名。再过反射获取类上注解,方法上注解及注解里的值。获取每一个url地址,与地址上的解释,生产一一对应的资源。

    例如: 所用主要框架: spring boot、swagger2


    【详情】

    1、反射获取类注解 @RequestMapping

    //通过反射获取到类,填入类名
    Class cl1 = Class.forName("");
    //获取RequestMapping注解
    RequestMapping anno = (RequestMapping) cl1.getAnnotation(RequestMapping.class);
    //获取类注解的value值  
    String[] value = anno.value();
    //将字符串数组转成字符串
    StringBuilder sb = new StringBuilder();
    for (String ele : value) {
        sb.append(ele);
    }
    String classPath = sb.toString();
    

    2、反射获取类注解 @GetMapping、@PutMapping、@PostMapping、@DeleteMapping

    //获取类中所有的方法
    Method[] methods = cl1.getDeclaredMethods();
    for (Method method : methods) {
        GetMapping getRequestMothed = (GetMapping) method.getAnnotation(GetMapping.class);
        PutMapping putRequestMothed = (PutMapping) method.getAnnotation(PutMapping.class);
        PostMapping postRequestMothed = (PostMapping) method.getAnnotation(PostMapping.class);
        DeleteMapping deleteRequestMothed = (DeleteMapping)method.getAnnotation(DeleteMapping.class);
       //获取类注解的value值
       String[] value1 = getRequestMothed .value();
       String[] value2 = putRequestMothed .value();
       String[] value3 = postRequestMothed .value();
       String[] value4 = deleteRequestMothed.value();
    } 
    

    3、反射获取类注解 @ApiOperation

    //获取类中所有的方法
    Method[] methods = cl1.getDeclaredMethods();
    for (Method method : methods) {
       ApiOperation apiOperation = method.getAnnotation(ApiOperation.class);
       //获取方法上@ApiOperation注解的value值
       apiOperationValue = apiOperation.value();
    }
    

    4、反射获取方法参数类表

    //通过反射获取到类
    String cl1 = Class.forName(string);
    //获取类中所有的方法
    Method[] methods = cl1.getDeclaredMethods();
    for (Method method : methods) {
        //获取方法参数注解
        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
        for (Annotation[] annotations : parameterAnnotations) {
            for (Annotation annotation : annotations) {
                //获取注解名
                String name = annotation.annotationType().getSimpleName();
            }
        }
    }
    
    展开全文
  • Mybatis中使用循环遍历

    2019-10-07 15:19:14
    Mybatis中传参数方法 1.使用注解绑定,mapper.xml 对应方法 不需要指定parameterType,(推荐使用注解绑定方式) 方法接口: List<CalculateIdeacommissionsum> selectByExample(@Param("example") ...

    Mybatis中传参数的方法

    1.使用注解绑定,mapper.xml 对应方法 不需要指定 parameterType,(推荐使用注解绑定方式)

    方法接口:

    List<CalculateIdeacommissionsum> selectByExample(@Param("example") CalculateIdeacommissionsum example,@Param("roleNameList") List<String> roleNameList);

    方法对应的Mapper.xml

    <!--  通过userStatus 排序查询 升序    -->
    <select id="selectByExample" resultMap="BaseResultMap">
    select
    id, calculateYear, calculateMonth, userId, userCode, userName, userStatus, companyName,
    companyId, curDeptId, curDeptName, roleName from Calculate_IdeaCommissionSum
    where calculateYear=#{example.calculateYear,jdbcType=SMALLINT}
    and calculateMonth=#{example.calculateMonth,jdbcType=SMALLINT}
    and deleteFlag=#{example.deleteFlag,jdbcType=TINYINT}
    <if test="roleNameList!=null and roleNameList.size()&gt; 0">
    <foreach collection="roleNameList" item="rolename" separator="," open="and rolename in(" close=")">
    #{rolename,jdbcType=VARCHAR}
    </foreach>
    </if>
    order by userStatus
    </select>
    2.如果接口参数没有使用注解绑定,mapper.xml 对应方法 需要指定对应的参数类型。

    List<CalculateIdeacommissionsum> selectByExample(CalculateIdeacommissionsum example);

    方法对应的Mapper.xml

    <!--  通过userStatus 排序查询 升序    -->
    <select id="selectByExample" parameterType="实体类路径" resultMap="BaseResultMap">
    select
    id, calculateYear, calculateMonth, userId, userCode, userName, userStatus, companyName,
    companyId, curDeptId, curDeptName, roleName from Calculate_IdeaCommissionSum
    where calculateYear=#{calculateYear,jdbcType=SMALLINT}
    and calculateMonth=#{calculateMonth,jdbcType=SMALLINT}
    order by userStatus
    </select>

    3. parameterType 也可以使用Map存放参数进行查询

    接口方法:

    List<BaseEmpinfo> selectByParam(Map<String,String> map);

    接口方法对应的Mapper.xml 文件方法:

    <select id="selectByParam" parameterType="java.util.Map" resultType="com.pacific.rspBonus.model.po.twBonus.mbg.BaseEmpinfo">
    select * from Base_EmpInfo
    where deleteFlag=0
    <if test="userName != null and userName!=''">
    and userName=#{userName,jdbcType=VARCHAR}
    </if>
    </select>
    4.mybatis 遍历循环
    collection标识我们程序传值过来的集合
    open表示我们遍历的集合以什么字符开始
    close表示我们遍历的集合以什么字符结尾
    item是给我们集合遍历取一个变量
    separator 表示的是分隔符,将我们集合中遍历出来的数据用","分隔开。
    <if test="roleNameList!=null and roleNameList.size()&gt; 0">
    <foreach collection="roleNameList" item="rolename" separator="," open="and rolename in(" close=")">
    #{rolename,jdbcType=VARCHAR}
    </foreach>
    </if>
    sql如下:

    select * from Calculate_IdeaCommissionSum where calculateYear=2019 and calculateMonth=2 and roleName  in ('副总经理','总监','经纪人');

    将roleName的多个条件用关系转化为 roleName in (roleName1,roleName2,roleName3...)  in中用foreach循环

    参考博客:https://jingyan.baidu.com/album/00a07f3873520e82d028dcce.html?picindex=1

    转载于:https://www.cnblogs.com/ming-blogs/p/10643076.html

    展开全文
  • 用于三方调用接口的统一入口,入口类GateWay扫描指定包下的service类,遍历该类中带自定义注解方法,通过不同参数执行指定的方法。 1、自定义注解 @Target({ElementType.FIELD, ElementType.METHOD}) //声明...

    用于三方调用接口的统一入口,入口类GateWay扫描指定包下的service类,遍历该类中带自定义注解的方法,通过不同参数执行指定的方法。

    1、自定义注解

    @Target({ElementType.FIELD, ElementType.METHOD}) //声明自定义的注解使用在方法上
    @Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
    @Documented
    public @interface MyAnnontation {
        String WayCode() default "none";
    
        String WayName() default "空";
    }

    2、执行注解类

    使用Reflections扫描包,所有带注解的类都写在com.holly.gateway.service包下。祥见代码

    public class GateWay {
    
        private static final Logger logger = LoggerFactory.getLogger(GateWay.class);
    
        public ResponseInfo gateWay(RequestInfo requestInfo) {
            ResponseInfo responseInfo = new ResponseInfo();
            Reflections reflections = new Reflections("com.holly.gateway.service");//包名且不可忘记,不然扫描全部项目包,包括引用的jar
            //获取带Service注解的类
            Set<Class<?>> typesAnnotatedWith = reflections.getTypesAnnotatedWith(Service.class);
            for (Class clazz : typesAnnotatedWith
            ) {
                Method[] methods = clazz.getDeclaredMethods();
                for (Method method : methods
                ) {
                    //判断带自定义注解MyAnnontation的method
                    if (method.isAnnotationPresent(MyAnnontation.class)) {
                        MyAnnontation annotation = method.getAnnotation(MyAnnontation.class);
                        //根据入参WayCode比较method注解上的WayCode,两者值相同才执行该method
                        if (null != annotation.WayCode() && annotation.WayCode().equals(requestInfo.getWayCode())) {
                            logger.info("WayCode = " + annotation.WayCode());
                            try {
                                //执行method
                                responseInfo = (ResponseInfo) method.invoke(clazz.newInstance(), requestInfo.getMap());
                            } catch (Exception e) {
                                logger.info("--------------执行自定义注解方法异常--------------");
                                e.printStackTrace();
                            }
                        }
    
                    }
    
                }
            }
            return responseInfo;
        }
    
        public static void main(String[] args) {
            Map<String, Object> map = new HashMap();
            map.put("Key1", "参数1");
            map.put("Key2", "参数2");
            RequestInfo requestInfo = new RequestInfo();
            requestInfo.setWayCode("b");//自定义注解的WayCode值,调用不同的方法
            requestInfo.setWayName("调测试方法1");
            requestInfo.setMap(map);
    
            GateWay gate = new GateWay();
            ResponseInfo responseInfo = gate.gateWay(requestInfo);
            logger.info(responseInfo.toString());
        }
    }
    

     

    3、在方法上添加@MyAnnontation注解

    在步骤2中main方法WayCode传值"b",则执行的是gateWayTwo方法

    @Service
    public class TestOne {
    
        @MyAnnontation(WayCode = "a",WayName = "测试类1")
        public ResponseInfo gateWayOne(Map<String, Object> map) {
            System.out.printf("gateWayOne printf" + map.get("Key1"));
            ResponseInfo res = new ResponseInfo();
            res.setTestId("000000");
            res.setTestName("U get Class gateWayOne");
            return res;
        }
    
        @MyAnnontation(WayCode = "b",WayName = "测试类2")
        public ResponseInfo gateWayTwo(Map<String, Object> map) {
            System.out.printf("gateWayOne printf" + map.get("Key2"));
            ResponseInfo res = new ResponseInfo();
            res.setTestId("000000");
            res.setTestName("U get Class gateWayTwo");
            return res;
        }
    
        @MyAnnontation
        public ResponseInfo gateWayThree(Map<String, Object> map) {
            System.out.printf("gateWayThree printf" + map.get("Key3"));
            ResponseInfo res = new ResponseInfo();
            res.setTestId("000000");
            res.setTestName("U get Class gateWayThree");
            return res;
        }
    
        public ResponseInfo gateWay4(Map<String, Object> map) {
            System.out.printf("gateWayThree printf" + map.get("Key4"));
            ResponseInfo res = new ResponseInfo();
            res.setTestId("000000");
            res.setTestName("U get Class gateWay4");
            return res;
        }
    }

    4、pom.xml

     <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.reflections/reflections -->
            <dependency>
                <groupId>org.reflections</groupId>
                <artifactId>reflections</artifactId>
                <version>0.9.11</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>

     

     

    展开全文
  • 官方注解:表示将处理不包含事件数据的事件的方法.2.为了方便传对象,需要建一个类继承于EventArgs EventArgs,英译:事件参数(Event Arguments)–Arguments:参数 官方注解:System.EventArgs是包含事

    事件传值

    步骤
    1.定义一个事件对象.

    public event EventHandler evt;

    EventHandler
    英译:事件处理器
    官方注解:表示将处理不包含事件数据的事件的方法.

    2.为了方便传对象,需要建一个类继承于EventArgs
    EventArgs,英译:事件参数(Event Arguments)–Arguments:参数
    官方注解:System.EventArgs是包含事件数据的类的基类.

    public class MyEventArgs:EventArgs--继承于EventArgs
    {
      public int Temp{get;set;}
      public object obj{get;set;}
    }

    申明自动属性存放事件数据.这里是存放数据的关键.

    关于一般数据库中存放男女为Bool类型时,调出来的时候可以考虑使用三元表达式简单转换.

    char str=Convert.ToBoolean(reader["gander"])?'男':'女';

    3.创建一个新建类的实例,在事件实例中传入需要存储的数据.

    MyEventArgs mea=new MyEventArgs();
    Student stu=new Student();
    str.Name="张三";
    str.Gender='男';
    str.Age=24;
    mea.obj=stu;--设定obj为object,存放任何数据类型.

    4.创建需要传值目标的对象,将方法作为参数进行传递.因为之前对自定义类的赋值,该事件已经有数据.

    FuZhi fz=new FuZhi();
    //注册事件
    this.evt+=new EventHandler(fz.SetText);
    //SetText是目标窗体的赋值方法.注意,事件只能+=-=.
    if(this.evt!=null)
    {
      this.evt(this,mea);
      fz.ShowFialog();
    }
    

    关于:this.evt(this,mea);
    evt是定义的一个事件对象

    public event EventHandler evt;

    本质上是一个这个方法.

    EventHandler(object sender,EventArgs e);

    也就是最常见的系统事件中的值.通过这个方法传递事件的参数到SetText中.—————待修正

    5.在目标窗体SetText方法中转换并且存值.

    public void SetText(object sender,EventArgs e)
    {
      MyEventArgs mea=e as MyEventArgs;
      //获取的对象是包含数据的,直接点出来完成传值.
    }

    遍历当前窗体所有的控件
    小应用:将当前窗体的TextBox值清空

    foreach(Control item in this.Controls)
    {
      //遍历当前窗体所有的控件
      TextBox b=item as TextBox;
      if(b!=null)
      {
        b.Text="";
      }
    }

    这种方法相对于Is As的方法更加节省性能.

    ComboBox

    ComboBox实用方法

    cbo.DisplayMember="coulumn_name1";

    DisPlayMember
    官方注解:获取或设置为此System.WIndows.Forms.ListControl显示的属性.
    也就是要显示在cbo中的值

    cbo.ValueMember="coulumn_name2";

    ValueMember
    官方注解:获取或设置一个属性,该属性将用作System.Windows.Forms.ListControl中的项的实际值.
    也就是实际对应的值.

    dgv中判断是否已经选中行

    dgv.SelectedRos.Count>0;

    SelectedRows
    官方注解:获取用户选定的行的集合.

    展开全文
  • 在Java8之前,代码编译为class文件后,方法参数的类型固定,...像mybatis等需要使用反射机制获取方法参数的时候就可以不用像以前一样需要使用类似于@Para之类的注解。 功能测试: import java.lang.reflect.Meth...
  • 注解实现EventBus功能

    2020-03-23 11:12:13
    1.定义一个Map集合存放注册EventBus的对象,以及该对象注册的事件方法参数 2.注册时去遍历获取该对象符合条件的注解属性,并存到步骤1的集合中 3.发送事件时,遍历步骤1创建的集合,判断发送事件的Object对象...
  • 像mybatis等需要使用反射机制获取方法参数的时候就可以不用像以前一样需要使用类似于@Para之类的注解。 功能测试 代码参考自,点击进入 编写测试类 import java.lang.reflect.Method; import java.lang....
  • 如果方法参数是对象的某个属性,而这个属性是 list或者array类型就可以写形参的名字) * open:条件的开始 * item:遍历集合时候定义的临时变量,存储当前遍历的每一个值。 * separator:多个值中间用","隔开 * ...
  • 尝试创建一个方法可以遍历整数型数组和字符串型数组,而在java中方法所接受的参数是只能被定义为一种类型,因此无法创建一种输出方法能适应输出三种数据类型数组。 所以需要对不同类型的数组来创建不同的方法,这...
  • ParamNameResolver在构造器中对getUserInfo进行解析,逻辑很简单,获取该方法所有参数类型进行遍历,如果该参数上有@Param注解就获取Param中的value作为属性名,没有的话就判断配置中useActualParamName是否允许使用...
  • 在Java8之前,代码编译为class文件后,方法参数的类型...像mybatis等需要使用反射机制获取方法参数的时候就可以不用像以前一样需要使用类似于@Para之类的注解。 功能测试 代码参考自,点击进入 编写测试类 import j...
  • 方法定义 @Autowired不仅可以标注在传统的setter方法之上,而且还可以标注于任意名称的方法定义,只要该方法定义了需要被注入的参数就行。 为了给容器中定义的每个bean定义对应的实例注入依赖,需要遍历所有bean...
  • 对数据两端的空格未进行处理,同时大家也不想遍历一遍参数然后再处理再封装到对象中,正好项目中有这个需要,所以就参考别的做了Post请求中针对application/json格式的有@RequestBody注解参数进行了去空格处理 ...
  • 就是在方法的上面加入@Autowired注解,容器中的对象会注入到对应类型的参数。 注意:暂时实现注入一个对象。所有方法参数列表的参数只能有一个。 实现思路 其实实现的思路和给字段注入的逻辑是一样的。遍历类...
  • Retrofit2源码分析

    2018-08-26 10:18:16
    Retrofit是对OkHttp网络请求的封装,利用注解使其转变为面向接口编程,利用动态代理将接口转变成具体实例,再利用反射和注解遍历接口方法的各种网络请求参数,并对其封装和缓存,利用策略模式适配不同的请求平台,...
  • 在init()中,反射"cn.jdk18"的所有带自定义注解@ProviderName的java文件,并且遍历的类要满足被DataProvider继承关系,将满足条件的类放到providers容器中 2.前端url 访问 {basePath}/jdbc 或{basePa...
  • 首先,SpringMVC框架在启动的时候会遍历Spring容器中的所有bean,对标注了@Controller或@RequestMapping注解的类中方法进行遍历,将类和方法上的@RequestMapping注解值进行...将这个Controller实例、方法及方法参数...
  • jdk4-14各个版本新特性

    2020-02-19 11:59:00
    JDK5 自动装箱、泛型、动态注解、枚举、可变长参数遍历循环 JDK6 提供动态语言支持、提供编译API和卫星HTTP服务器API,改进JVM的锁,同步垃圾回收,类加载 JDK7 提供GI收集器、加强对非Java语言的调用支持(JSR-...
  • java mybatis 执行失败

    2020-10-23 16:23:29
    1.在方法参数前面加上你遍历的集合的名称,比如你在foreach的collection中写的是noList,那么你就在传入的list参数前面加上一个注解@Param(“noList”)。 2.将foreach的collection中的值改成list即可 ...
  • 通过反射获取到此对象object所在Class的所有方法, 遍历所有方法,找到@Subscribe注解方法,经过判断保护,然后将每个有@Subscribe注解方法分别封装成一个JavaBean对象,此JavaBean对象的字段包括方法参数类型,...
  • 注解: @FunctionalInterface 函数式接口 -> 左边为接口的引用 -> 右边为方法体 接口中只能写一个方法 不带参数的Lambda表达式 带参数的Lambda表达式 Lambda表达式在List接口中的使用 可以在list.foreach...
  • 各个JDK版本新语法糖

    2018-11-13 15:53:00
    自动装箱、泛型、动态注解、枚举、可变长参数、循环遍历等语法 JDK7 fork/join jdk8 二进制数的原生支持、switch语句中支持string <>操作符 异常处理改进、简化变长参数方法调用、面向资源的try-catch-...
  • Java异常记录之——NoSuchElementException

    万次阅读 2018-05-08 15:13:08
    今天启动项目的时候报了这个错,度娘有的说是线程越界,有的...手动加了一个query注解,恍然大悟,以前是三个参数,为了提高效率,减少查询次数,减了一个参数,但是方法名没有变,这样jpa在自己解析参数的时候第三...

空空如也

空空如也

1 2 3 4 5
收藏数 84
精华内容 33
关键字:

方法参数注解遍历