Java Annotations

  • + 5 comments

    The description is so bad, no where to find why senior should have 100 and junior should have 50 as limits. But these values somehow work. Solution below passes all testcases.

    import java.lang.annotation.*;
    import java.lang.reflect.*;
    import java.util.*;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface FamilyBudget {
       String userRole() default "GUEST";
       int budgetLimit() default 0;
        
    }
    
    class FamilyMember {
       @FamilyBudget(userRole = "SENIOR", budgetLimit = 100)
       public void seniorMember(int budget, int moneySpend) {
          System.out.println("Senior Member");
          System.out.println("Spend: " + moneySpend);
          System.out.println("Budget Left: " + (budget - moneySpend));
       }
     
       @FamilyBudget(userRole = "JUNIOR", budgetLimit = 50)
       public void juniorUser(int budget, int moneySpend) {
          System.out.println("Junior Member");
          System.out.println("Spend: " + moneySpend);
          System.out.println("Budget Left: " + (budget - moneySpend));
       }
    }
    
    public class Solution {
       public static void main(String[] args) {
          Scanner in = new Scanner(System.in);
          int testCases = Integer.parseInt(in.nextLine());
          while (testCases > 0) {
             String role = in.next();
             int spend = in.nextInt();
             try {
                Class annotatedClass = FamilyMember.class;
                Method[] methods = annotatedClass.getMethods();
                for (Method method : methods) {
                   if (method.isAnnotationPresent(FamilyBudget.class)) {
                      FamilyBudget family = method
                            .getAnnotation(FamilyBudget.class);
                      String userRole = family.userRole();
                      int budgetLimit = family.budgetLimit();
                      if (userRole.equals(role)) {
                         if(budgetLimit >= spend){
                            method.invoke(FamilyMember.class.newInstance(),
                                  budgetLimit, spend);
                         }else{
                            System.out.println("Budget Limit Over");
                         }
                      }
                   }
                }
             } catch (Exception e) {
                e.printStackTrace();
             }
             testCases--;
          }
       }
    }