反射和注解的应用
一、利用Properties读取配置文件,再用反射进行获得类的方法调用
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectTest {
public static void main(String[] args) throws Exception {
//Properties读取配置文件
Properties pro = new Properties();
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
// 利用反射来调用获得的类中的方法
// className为要用的类的路径名
Class<?> cls = Class.forName(className);
// 通过getConstructor()获得无参构造方法,再newInstance创建对象,作为后面方法调用的载体对象
Object obj = cls.getConstructor().newInstance();
// 反射获取方法,先传方法名称,再按顺序传参数的类型字节码,基本类型也可以用.class的方式来获得字节码
Method method = cls.getMethod(methodName, String.class);
// 暴力反射
method.setAccessible(true);
// invoke调用方法,先传载体对象,再按顺序传参,与反射获取对象的对饮字节码一一对应
method.invoke(obj, "卢本伟");
}
}
二、利用注解来简化读取配置文件的步骤,然后进行反射应用
import java.lang.reflect.Method;
@MyAnnotation(className = "Student", methodName = "method2")
public class ReflectAnnotationTest {
public static void main(String[] args) throws Exception {
Class<ReflectAnnotationTest> cls = ReflectAnnotationTest.class;
// 用本类的字节码文件,来获取加在本类上的注解里信息
MyAnnotation annotation = cls.getAnnotation(MyAnnotation.class);
String className = annotation.className();
String methodName = annotation.methodName();
/*System.out.println(className);
System.out.println(methodName);*/
// 下面就是反射调用方法的常规步骤了
Class<?> acls = Class.forName(className);
Object obj = acls.getConstructor().newInstance();
Method method = acls.getMethod(methodName, String.class);
method.setAccessible(true);
method.invoke(obj, "卢本伟");
}
}
网友评论