17日目注記の補足
注記と反射プロファイル getAnnotation(MyAnno.class)はMyAnnoの実装クラスを取得し、MyAnnoタイプのサブクラスを返します. Class clazz = TestPerson.class; そのクラスのバイトコードファイルを取得すると、クラスはバイトコードの汎用型である.
注釈と反射で簡単なフレームワークを作る e.getCause()は、Throwタイプのサブクラス を返します. e.getCause().getClass().getName()は、この例外の名前 を取得します. e.getCause().getMessage()異常の記述情報
反射中の汎用消去
@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);
}
}
注釈と反射で簡単なフレームワークを作る
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);
}
}