}
private void doAfter() {
System.out.println("after method invoke!");
}
}
测试代码:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
HelloWorld hw = new HelloWorldImpl();
InvocationHandler handler = new HelloWorldHandler(hw);
HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(
hw.getClass().getClassLoader(),
hw.getClass().getInterfaces(),
handler);
proxy.sayHelloWorld();
}
}
?首先获取一个业务接口的实现对象java动态代理的代码;
?获取一个InvocationHandler实现,此处是HelloWorldHandler对象java动态代理的代码;
?创建动态代理对象java动态代理的代码;
?通过动态代理对象调用sayHelloWorld()方法,此时会在原始对象HelloWorldImpl. sayHelloWorld()方法前后输出两句字符串 。
运行测试类输出如下:
before method invoke!
Hello World!
after method invoke!
此处Test类中的方法调用代码比较多,在我们的实际应用中可以通过配置文件来来简化客户端的调用实现 。另外也可以通过动态代理来实现简单的AOP 。
java 动态代理实例?1. 代理模式
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问 。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 。
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象 。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装 。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象 。
以下以《Java与模式》中的示例为例:
抽象角色:
abstractpublicclassSubject{
abstractpublicvoidrequest();
}
真实角色:实现了Subject的request()方法 。
publicclassRealSubjectextendsSubject{
publicRealSubject(){ }
publicvoidrequest(){
System.out.println( " From real subject. " );
}
}
代理角色:
publicclassProxySubjectextendsSubject{
privateRealSubject realSubject;// 以真实角色作为代理角色的属性
publicProxySubject(){ }
publicvoidrequest(){// 该方法封装了真实对象的request方法
preRequest();
if ( realSubject==null){
realSubject=newRealSubject();
}
realSubject.request();// 此处执行真实对象的request方法
postRequest();
}
客户端调用:
Subject sub = newProxySubject();
Sub.request();
由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理 RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题 。
另外,如果要按照上述的方法使用代理模式 , 那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性 。但是实际使用时,一个真实角色必须对应一个 代理角色 , 如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决 。
2.动态代理类
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args) 。在实际使用时 , 第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组 。这个抽象方法在代理类中动态实现 。
推荐阅读
- 制作微信网站的链接,微信自己制作链接
- chatgpt提问要收费吗,chattalk
- 益智沙盘游戏.,益智沙盘游戏
- 笔记本电脑显卡怎么换,笔记本电脑显卡换一个多少钱
- python缓动函数 python执行慢
- 卟扒公众号怎么用,爬微信公众号
- 天津路由器怎么重启密码,tianyi路由器管理密码
- 游戏开发大亨手谈,游戏开发大亨攻略2021
- mysql数据怎么加写锁 mysql 怎么加锁