使用反射之前的代码
public class P1 {
public void eat(){
System.out.println("p1的方法");
}
}
public class P2 {
public void sleep(){
System.out.println("p2的方法");
}
}
public class Reflect1 {
public static void main(String[] args) throws Exception {
//可以创建任意类的对象,不能改变任何代码
/* P1 p = new P1();
p.eat();
P2 stu = new P2();
stu.sleep();*/
}
使用反射之后的代码
public class Reflect1 {
public static void main(String[] args) throws Exception {
//可以创建任意类的对象,不能改变任何代码
/* P1 p = new P1();
p.eat();
P2 stu = new P2();
stu.sleep();*/
//加载配置文件
Properties properties = new Properties();
ClassLoader loader = Reflect1.class.getClassLoader();
InputStream is = loader.getResourceAsStream("pro.properties");
properties.load(is);
//获取配置文件加载的数据
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
//加载类进内存
Class<?> cla = Class.forName(className);
//创建对象
Object o = cla.newInstance();
//获取方法对象
Method method = cla.getMethod(methodName);
//执行方法
method.invoke(o);
}
}
#只是一个配置文件pro.properties
className=domain.P1
methodName=eat
总结:看上去反射代码更加复杂,但是倘若我们并不知道字节码文件,可以通过反射技术调用方法即可,简单修改配置文件就能实现对象以及功能的改变,还可以爆破一些方法和变量(也不知道是好是坏)
反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创和控制任何类的对象,无需提前硬编码目标类,我认为还是非常符合代码设计原则的。