JAVA反射机制

反射:
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

反射就是把java类中的各种成分映射成一个个的Java对象;

静态编译:在编译时确定类型,绑定对象。
    MerchantAccountReq req = new MerchantAccountReq(); 
动态编译:运行时确定类型,绑定对象。
    private IRefundService refundService;
    refundService编译时只是声明,没有进行赋值,不能确定具体类型,运行时确定类型;
反射机制的优点:可以实现动态创建对象和编译,体现出很大的灵活性(特别是在J2EE的开发中它的灵活性就表现的十分明显)。通过反射机制我们可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。

反射机制的缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它 满足我们的要求。这类操作总是慢于只直接执行相同的操作。

反射机制实例:

   一、 创建接口:

public interface Behaviour {
    public void eat();
    public String run();
}
二、创建2个接口实现类:
    第一个类:
public class PeopleTest implements Behaviour{
    public void eat() {
        System.out.println("eating is happy");
    }

    public String run() {
        System.out.println("run is healthy");
        return null;
    }
}
第二个类:
 
public class StudentTest implements Behaviour{

    public void eat() {
        System.out.println("students like eating");
    }

    public String run() {
        System.out.println("students don't like running");
        return null;
    }
}

三、创建TestBehaviour实现反射:

 
import java.lang.reflect.Constructor;

public class TestBehaviour {
    private static Behaviour peo;
    public static void main (String[] args) throws Exception {
        Class people = ClassLoader.getSystemClassLoader().loadClass("StudentTest");
        //获取people的构造方法p
        Constructor p = people.getConstructor();
        //执行构造方法得到people的对象
        Object obj = p.newInstance();
        //obj强转为Behaviour类型
        peo = (Behaviour) obj;
        peo.eat();
    }
}
此方法当输出内容为:students like eating
若需要调用Peoloe中的eat()方法,将loadClass("StudentTest")替换为loadClass("PeopleTest")即可,当前内容已表示
出反射机制的优点,对于任意一个类,都能够知道这个类的所有属性和方法,试想,如果不采用反射机制,需要对每一个
需要调用的类进行new对象,当一个接口增加实现类(比如增加PeopleTest),那么,本来new StudentTest类的地方,均需要
更改为new PeopleTest,耗时耗力且不能保证没有遗漏;

 反射机制,如果将Class people = ClassLoader.getSystemClassLoader().loadClass("StudentTest");中的StudentTest或

PeopleTest在配置文件中配置,那么对于上面的情况更改一次配置文件即可达到效果。
注意:
loadClass("StudentTest")引号间需要传入类的完全限定名(也就是包名.类名)。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值