反射Demo

2020-03-27 16:04:55来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

反射Demo

使用反射之前的代码

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

总结:看上去反射代码更加复杂,但是倘若我们并不知道字节码文件,可以通过反射技术调用方法即可,简单修改配置文件就能实现对象以及功能的改变,还可以爆破一些方法和变量(也不知道是好是坏)

反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创和控制任何类的对象,无需提前硬编码目标类,我认为还是非常符合代码设计原则的。

 


原文链接:https://www.cnblogs.com/shun998/p/12579451.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:原创 记录一次线上Mysql慢查询问题排查过程

下一篇:Java基础语法(2)-变量