java之动态代理
java之动态代理
代理基础
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。
这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.。
代理分为三种:静态代理、动态代理、Cglib代理
本文将要介绍的就是动态代理。
动态代理
动态代理的特点
1、代理对象:不需要实现接口 2、代理对象的生成,是利用JDK的API,动态的在内存构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型) 3、动态代理也叫JDK代理,接口代理
JDK中共生成代理对象的API代理类所在的包:java.lang.reflect.ProxyJDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整写法是:static Object newProxyInstance(ClassLoader loader, Class>[] interfaces,InvocationHandler h )
ClassLoader loader,:指定当前目标对象使用类加载器,获取加载器的方法是固定的Class>[] interfaces,:目标对象实现的接口的类型,使用泛型方式确认类型InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
该方法可以在代理类中实现,也可以在main函数中实现。注:接口和目标类同静态代理中User和UserInfo方法一:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class LogHandler implements InvocationHandler {//被代理对象private Object play;
//构造方法,并初始化被代理对象public LogHandler(Object play) {this.play = play;}
@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable{//通过动态代理类,可以在调用之执行一些相关操作doBefore();System.out.println("调用被代理类对象的方法是: "+ method.getName()+" 抽象角色是"+method.getDeclaringClass());//调用被代理对象将要被执行的方法Object result = method.invoke(play,args);//通过动态代理类,可以在调用之后执行一些相关操作doAfter();return result;}
public void doBefore(){System.out.println("before....光头强打飞机....");}private void doAfter(){System.out.println("after....光头强打完飞机....");}
}
测试代码:
public class ProxyTest {public static void main(String[] args){UserInfo userInfo =new UserInfo(1,"光头强","123");LogHandler handler = new LogHandler(userInfo);User user =(User) Proxy.newProxyInstance(userInfo.getClass().getClassLoader(),userInfo.getClass().getInterfaces(),handler);user.playGame();}
}
注意:动态代理建立在反射的基础上
方法二:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Uproxy {private Object target;public Uproxy(Object target){this.target = target;}
public Object getProxyInstance(){return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {doBefore();Object returnValue = method.invoke(target,args);doAfter();return returnValue;}});}public void doBefore(){System.out.println("before....光头强打飞机....");}private void doAfter(){System.out.println("after....光头强打完飞机....");}
}
测试代码:
public class ProxyT {public static void main(String[] args){User userInfo = new UserInfo();System.out.println(userInfo.getClass());
User proxy = (User)new Uproxy(userInfo).getProxyInstance();proxy.playGame();
}
}
注意:同静态代理不同的是,动态代理是以接口为返回对象的。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
