17日目注記の補足


注記と反射プロファイル
  • getAnnotation(MyAnno.class)はMyAnnoの実装クラスを取得し、MyAnnoタイプのサブクラスを返します.
  • Class clazz = TestPerson.class; そのクラスのバイトコードファイルを取得すると、クラスはバイトコードの汎用型である.
    	@Retention(RetentionPolicy.RUNTIME)
    	@Target(ElementType.TYPE)
    	public @interface MyAnno {
    	  String className();
    	  String methodName();
    	}
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Method;
    
    @MyAnno(className = "test3.Person",methodName = "speak")
    public class TestPerson {
        public static void main(String[] args) throws Exception{
            Class<TestPerson> clazz = TestPerson.class;//           
            MyAnno anno1 = clazz.getAnnotation(MyAnno.class);//  MyAnno     
            String className = anno1.className();
            String methodName = anno1.methodName();
    
            Class clazz1 = Person.class;
            Object o = clazz1.newInstance();
            Method method = clazz1.getDeclaredMethod("speak");
            method.setAccessible(true);
            method.invoke(o);
        }
    }
    

  • 注釈と反射で簡単なフレームワークを作る
  • e.getCause()は、Throwタイプのサブクラス
  • を返します.
  • e.getCause().getClass().getName()は、この例外の名前
  • を取得します.
  • e.getCause().getMessage()異常の記述情報
  • public class Calculator {
        @Check
        public int add(){
            return 1+0;
        }
        @Check
        public int sub(){
            return 1-0;
        }
        @Check
        public int div(){
            return 1/0;
        }
        @Check
        public int mul(){
            return 1*0;
        }
    }
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Check {
    }
    
    public class TestCheck {
        public static void main(String[] args) throws Exception{
            int number = 0;
            BufferedWriter bw = new BufferedWriter(new FileWriter("day16/bug.txt"));
            Calculator calculator = new Calculator();
            Class clazz = Calculator.class;
            Method[] methods = clazz.getDeclaredMethods();
            for (Method method : methods) {
                if(method.isAnnotationPresent(Check.class)){
                    try{
                        method.invoke(calculator);
                    }catch (Exception e){
                        number++;
                        bw.write(method.getName()+"     ");
                        bw.newLine();
                        bw.write("     :"+e.getCause().getClass().getName());
                        bw.newLine();
                        bw.write("     :"+e.getCause().getMessage());
                        bw.newLine();
                        bw.write("------------------------------------------");
                        bw.newLine();
    	                }
    	            }
    	        }
            bw.write("      "+number+" ");
            bw.close();
    
        	}
    	}
    

    反射中の汎用消去
    public class Test {
        public static void main(String[] args) throws Exception{
            ArrayList<Integer> list = new ArrayList<>();
            list.add(1);
            Class clazz = ArrayList.class;
            Method method = clazz.getDeclaredMethod("add",Object.class);
            method.setAccessible(true);
            method.invoke(list,"  ");
            System.out.println(list);
        }
    }