- 下面使用自定义注解来描述配置文件,使用解析注解来替代加载配置文件操作来获取文件中属性
- 使用步骤
需求:
- 写一个"框架类",在不改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中的任意方法
package annotationTest;
public class Demo01 {
public void show(){
System.out.println("Demo01...show()...");
}
}
package annotationTest;
public class Demo02 {
public void show(){
System.out.println("Demo02...show()...");
}
}
package annotationTest;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 下面使用自定义注解来描述配置文件,使用解析注解来替代加载配置文件:
* 配置文件的代码,需要获取配置文件中的属性className全类名和要执行的方法名
* methodName,配置文件中的属性在注解中可以作为属性来定义,然后在类中使用注解时直接
* 给注解的属性赋值,这样就不需要配置文件了。
*/
//设置元注解
@Target({ElementType.TYPE}) //表示该元注解标识的注解Prop_Anno的作用位置是类
@Retention(RetentionPolicy.RUNTIME)//期望注解Prop_Anno保留到runtime阶段
public @interface Prop_Anno {
String className(); //全类名
String methodName();//方法名
/**解析注解时获取注解对象其实就是在内存中生成一个该注解接口的实现类和该对象anno,
* 然后可以使用该对象anno调用注解中抽象方法className()方法和methodName()
* 获取到注解中的属性值(全类名和方法名)
* public class PropImp implements Prop_Anno{
* public String className(){
* return annotationTest.Demo01;
* }
* public String methodName(){
* return "show";
* }
* }
*/
}
package annotationTest;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
//自定义注解中两个属性:指定全类名和类中要执行的方法,就可创建任意类执行任意方法
@Prop_Anno(className="annotationTest.Demo01",methodName = "show")
public class Reflect_File_Anno {
public static void main(String[] args) throws Exception {
//1.解析注解
//1.1获取该类的字节码文件对象(获取注解定义的位置的对象)
Class<Reflect_File_Anno> cla = Reflect_File_Anno.class;
//2.通过字节码文件对象获取Prop_Anno注解对象
/**解析注解时获取注解对象其实就是在内存中生成一个该注解接口的实现类和该对象anno*/
Prop_Anno anno = cla.getAnnotation(Prop_Anno.class);
//3.调用注解对象中定义的抽象方法,获取返回值
String className = anno.className();
String methodName = anno.methodName();
System.out.println(className);//annotationTest.Demo01
System.out.println(methodName);//show
//4.加载该类进内存,并获取内存中Class对象
Class cn = Class.forName(className);
//5.使用Class对象调用newInStance方法获取该类对象,
Object obj = cn.newInstance();
//6.通过Class对象调用getMethod方法获取方法对象
Method method = cn.getMethod(methodName);
//7.方法对象调用invoke方法执行该方法(即Demo01类中的show方法)
method.invoke(obj);//要指明执行的是obj对象的show方法
//输出Demo01...show()...
}
}