反射定义
JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 1. 理解反射的概念,反射之中包含了一个「反」字,因此了解反射咱们先从「正」开始。 1.1)通常状况下,咱们使用某个类时一定知道它是什么类,是用来作什么的。因而咱们直接对这个类进行实例化,以后使用这个类对象进行操做。 1.2)反射则是一开始并不知道我要初始化的类对象是什么(或者是第三方的类没有提供对外的构造方法等状况),天然也没法使用 new 关键字来建立对象了。这时候,咱们使用 JDK 提供的反射 API 进行反射调用
测试类:java
ppackage animal; public class Dog { private String name; private int age; private Dog() { this.name = "dav"; this.age = 2; } public Dog(String name) { this.name = name; } public Dog(String name, int age) { this.name = name; this.age = age; } public void eat(String food) { System.out.println("dog " + name + " eat " + food); } private void sleep(int hours) { System.out.println("dog " + name + " sleep " + hours + " hours"); } }
反射的相关操做 缓存
代理模式定义
给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。目的: (1)经过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的没必要要复杂性。 (2)经过代理对象对原有的业务加强。 测试
- 静态代理 一个代理对象和真实对象 存在一个肯定关系(一对一 或者 一对多)便是代理对象中的真实对象是肯定的。(违反开闭原则,扩展能力差,可维护性差)
- 动态代理:是指在使用时再建立代理类和实例 1)优势:只须要1个动态代理类就能够解决须要建立多个静态代理才能处理的问题,避免重复、多余代码,更强的灵活性 2)缺点:效率低,相比静态代理中 直接调用目标对象方法,动态代理则须要先经过Java反射机制,从而间接调用目标对象方法。 3)应用场景局限:由于 Java 的单继承特性(每一个代理类都继承了 Proxy 类),即只能针对接口 建立 代理类,不能针对类建立代理类。在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler接口、另外一个则是 Proxy类,这个类和接口是实现咱们动态代理所必须用到的。 InvocationHandler接口是给动态代理类实现的,负责处理被代理对象的操做的,而Proxy是用来建立动态代理类实例对象的,由于只有获得了这个对象咱们才能调用那些须要代理的方法。
4)动态代理实现原理: 经过 Proxy.newProxyInstance()方法动态生成一个代理类(这个动态生成的代理类 实现是被代理类 实现的接口),并缓存。用户获取到这个代理类后 调用接口中的方法会走到 invoke 方法中,最后由被代理类的具体实现类来操做方法。(因此动态代理类中须要实现invocationHandler接口,并完成invoke方法的反射调用) 5)实现范例
this