java反射应用之动态代理
2016-09-18 20:27
417 查看
之前看了java反射 看得很慢 就是感觉看不走那种 后面通过慢慢观看视频 手写代码 对java反射有了一定的了解
java反射之动态代理
首先理解一下静态代理 什么是静态代理 就是运用接口然后新建一个代理类通过代理类实例化被代理类对象来调用被代理类方法
其次静态代理的缺点 代理类和被代理类在编译期间已经确定不易于程序的扩展 下面一个made nike factory 来帮助理解什么是静态代理
package pers.Hx.dynamic;
//静态代理模式
//接口
interface ClothFactory{
void productCloth();
}
//被代理类
class NikeClothFactory implements ClothFactory{
public void productCloth(){
System.out.println("run i am product Nike!!");
}
}
//代理类
class ProxyFactory implements ClothFactory{
ClothFactory cf; //被代理类的对象
public void productCloth() {
System.out.println("代理类开始执行,收代理费$100000 ");
cf.productCloth();
}
//创建代理类的对象时实际传入一个被代理类的对象
public ProxyFactory(ClothFactory cf){
this.cf = cf;
}
}
//测试动态代理类
public class TestClothFactory {
public static void main(String[] args) {
NikeClothFactory nike = new NikeClothFactory();
ProxyFactory proxy = new ProxyFactory(nike);
proxy.productCloth();
}
}
下面介绍 动态代理
动态代理 优点:可以通过一个类来完成全部的代理功能
代码
package pers.Hx.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理的公共接口 动态代理的使用,体会反射是动态语言的关键
interface Subject{
void action();
}
//被代理类
class RealSubject implements Subject{
public void action(){
System.out.println("i am the Proxy class,please rember excute me! thinks!!!");
}
}
//代理的动态代理类
class MyInvocationHandler implements InvocationHandler{
Object obj;//实现了接口的被代理的对象的声明
//①给被代理的对象实例化②返回一个代理类的对象
public Object blind(Object obj){
this.obj = obj; //给被代理的对象实例化
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), this);//返回一个代理类的对象
}
//当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下 的invoke的方法的调用
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method方法的返回值时retu rnVal
Object returnVal = method.invoke(obj, args);
return returnVal;
}
}
public class TestProxy {
public static void main(String[]args){
//1.倍代理类的对象
RealSubject real = new RealSubject();
//2.创建一个实现了InvacationHandler接口的类的对象
MyInvocationHandler handler =new MyInvocationHandler();
//3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象
Object obj = handler.blind(real);
System.out.println(obj.toString());
//把代理类对象 强转为本类型
Subject sub = (Subject) obj;
//转到对InvacationHandler接口的实现的invoke()方法的调用
sub.action();
//对静态的例子重新调用
NikeClothFactory nike = new NikeClothFactory();
//直接强制转换
ClothFactory proxyCloth =(ClothFactory) handler.blind(nike);
proxyCloth.productCloth();
}
}
注: 上面两个类的类名分别叫做 TestClothFactory 与 TestProxy
第一个类可以单独运行 因为是独立的并且有main函数
第二个类要运行 必须和第一个类在同一个目录下因为第二个类用了第一个类中的类
建议看了之后手敲一次
毕竟 手敲代码才能真正的理解代码
java反射之动态代理
首先理解一下静态代理 什么是静态代理 就是运用接口然后新建一个代理类通过代理类实例化被代理类对象来调用被代理类方法
其次静态代理的缺点 代理类和被代理类在编译期间已经确定不易于程序的扩展 下面一个made nike factory 来帮助理解什么是静态代理
package pers.Hx.dynamic;
//静态代理模式
//接口
interface ClothFactory{
void productCloth();
}
//被代理类
class NikeClothFactory implements ClothFactory{
public void productCloth(){
System.out.println("run i am product Nike!!");
}
}
//代理类
class ProxyFactory implements ClothFactory{
ClothFactory cf; //被代理类的对象
public void productCloth() {
System.out.println("代理类开始执行,收代理费$100000 ");
cf.productCloth();
}
//创建代理类的对象时实际传入一个被代理类的对象
public ProxyFactory(ClothFactory cf){
this.cf = cf;
}
}
//测试动态代理类
public class TestClothFactory {
public static void main(String[] args) {
NikeClothFactory nike = new NikeClothFactory();
ProxyFactory proxy = new ProxyFactory(nike);
proxy.productCloth();
}
}
下面介绍 动态代理
动态代理 优点:可以通过一个类来完成全部的代理功能
代码
package pers.Hx.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理的公共接口 动态代理的使用,体会反射是动态语言的关键
interface Subject{
void action();
}
//被代理类
class RealSubject implements Subject{
public void action(){
System.out.println("i am the Proxy class,please rember excute me! thinks!!!");
}
}
//代理的动态代理类
class MyInvocationHandler implements InvocationHandler{
Object obj;//实现了接口的被代理的对象的声明
//①给被代理的对象实例化②返回一个代理类的对象
public Object blind(Object obj){
this.obj = obj; //给被代理的对象实例化
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), this);//返回一个代理类的对象
}
//当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下 的invoke的方法的调用
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method方法的返回值时retu rnVal
Object returnVal = method.invoke(obj, args);
return returnVal;
}
}
public class TestProxy {
public static void main(String[]args){
//1.倍代理类的对象
RealSubject real = new RealSubject();
//2.创建一个实现了InvacationHandler接口的类的对象
MyInvocationHandler handler =new MyInvocationHandler();
//3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象
Object obj = handler.blind(real);
System.out.println(obj.toString());
//把代理类对象 强转为本类型
Subject sub = (Subject) obj;
//转到对InvacationHandler接口的实现的invoke()方法的调用
sub.action();
//对静态的例子重新调用
NikeClothFactory nike = new NikeClothFactory();
//直接强制转换
ClothFactory proxyCloth =(ClothFactory) handler.blind(nike);
proxyCloth.productCloth();
}
}
注: 上面两个类的类名分别叫做 TestClothFactory 与 TestProxy
第一个类可以单独运行 因为是独立的并且有main函数
第二个类要运行 必须和第一个类在同一个目录下因为第二个类用了第一个类中的类
建议看了之后手敲一次
毕竟 手敲代码才能真正的理解代码
相关文章推荐
- 0025 Java 动态代理(反射的应用)【基础】
- Java学习笔记之反射的应用-动态代理
- JAVA核心层--反射--动态代理
- 用Annotation,Future,动态代理实现自己的JAVA方法运行超时应用
- Java反射的高级应用,模拟开发环境IDE动态搜索类成员以及方法,。。。。。
- Java反射之JDK动态代理实现简单AOP
- 模拟实现Struts拦截器-蕴含着代理模式,AOP,工厂模式,依赖注入,Java 反射,动态构造等机制
- Java动态代理二——CGLIB动态代理应用
- Java反射的高级应用,模拟开发环境IDE动态搜索类成员以及方法,。。。。。
- java的动态代理和反射
- Java 反射与代理技术及应用解读
- java反射--动态代理学习案例代码
- 【转】java的反射机制中的动态代理代理(一)--简介
- Java深度历险——Java反射与动态代理
- JAVA中代理与反射的应用
- Aop应用原理 JDK动态代理、代理模式与反射
- Java动态代理二――CGLIB动态代理应用
- Java深度历险(七)——Java反射与动态代理
- 黑马程序员-----java基础二十一(java之反射技术应用(代理))
- JAVA核心层--反射--动态代理