反射
作用:
1.可以创建对象。
2.调用对象的方法。
3.设置和获取对象的属性。
4.获取类名、包名等等
用反射可以操作这个类的一切信息。反射就是对自身的自省
获取字节码对象的三种方式
类名.class
对象名.getClass()
Class.forName(类的全限定名)
获取一个类的方法
1,getMethods()和getDeclaredMethods()获取类的所有方法
getMethod(“方法名”,参数的类型.class…)
getDeclaredMethod(“方法名”,参数的类型.class…)
2,调用方法
method.invoke(对象,参数…)
3.获取类中的成员变量
getFields()和getDeclaredFields()
getField(参数名)和getDeclaredField(参数名)
4,获取参数值
field.get(对象)
5,设置参数值
field.set(对象,参数值)
代理
1,动态代理它可以直接给某一个目标对象(委托对象)生成一个代理对象,而不需要代理类存在。
甚至它还能够给某一个接口直接生成代理对象,而不需要委托类和代理类的存在。
2,动态代理与静态代理模式原理是一样的,只是动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理者和委托者的关系是在程序运行时确定。
3,还有个cglib,只是不用实现接口
动态代理的使用
Proxy.newProxyInstance(classLoader,interfaces,invocationHandler)
1. classLoader,类加载器对象
2. interfaces,委托者实现的所有接口的字节码对象的数组
3. InvocationHandler接口的实现类对象
通过上述方法我们就能得到代理对象,使用委托者实现的接口类型执行代理对象
InvocationHandler接口中的invoke(Object proxy,Method method,Object[] args)
1.该方法是代理对象调用任意方法的时候执行
2.参数
1.proxy代理对象本身
2.method就是代理对象调用的方法
3.args代理对象调用的方法传入的参数
3.invoke方法的返回值就是代理对象调用的方法的返回值
使用过程
-
第一步:定义一个代理接口
-
第二步:写两个委托类实现上述接口
-
第三步:定义一个类实现InvocationHandler接口
-
第四步:在调用者中,使用Proxy.newProxyInstance()方法创建代理对象
总结,还是很重要,欢迎交流