反射和注解
反射和注解
反射
获取字节码的三种方法:
获取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);