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