反射和注解

反射

获取字节码的三种方法:

 获取class对象的三种方法
 1.Class.forName(全类名)
 2.类名.class
 3.对象.getClass()

如:

		//1.Class.forName(全类名)
		Class<?> clazz1 = Class.forName("com.njau.construct.Person");
		//2.类名.class
        Class<Person> clazz2 = Person.class;
        //3.对象.getClass()
        Person person = new Person();
        Class<? extends Person> clazz3 = person.getClass();

(其他操作可看JDK文档的Class类进行)

注解

例:

/** * @author 张文军 * @Description: * @Company:南京农业大学工学院 * @version:1.0 * @date 2019/8/3113:57 */
@Target({ElementType.TYPE})//注解可以用于什么位置
@Retention(RetentionPolicy.RUNTIME)//注解保留的时期(源码,Class,RunTime)
public @interface Pro {//注解的形式//public @interface 注解名称
/** * *以下为注解的属性,即接口的方法 */
    /** * 类的全路径 * @return */
    String clazzPath();

    /** * 方法名 * @return */
    String methName();
}

解析注解

 		//获取当前类的Class(字节码文件对象)、
        Class<TestPro> testProClass = TestPro.class;
        /** 获取注解的对象(注解在哪里就获取哪里的注解对象,这里是在类上, 所以获取该类的注解对象)用相对应的对象获取指定的注解对象,如当前是Pro.class 注解 */
        Pro proClassAnnotation = testProClass.getAnnotation(Pro.class);
        //获取注解的属性
        String clazzPath = proClassAnnotation.clazzPath();
        String methName = proClassAnnotation.methName();
        //用反射的方法创建对象和运行方法(注解的使用)
        Class<?> aClass = Class.forName(clazzPath);
        Object instance = aClass.newInstance();
        Method method = aClass.getMethod(methName);
        method.invoke(instance);