动态代理嘛,就是动态代理。行了 ,定义解释完毕
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象时,是通过代理对象来访问的
/*
JDk动态代理需要基于接口实现,所以先建立接口
*/
package lJdkproxyExample;
public interface HellowWordImpl {
public void SayHellowWord() ;
}
/*
建立实现接口的实现类,输对应的文字
*/
package lJdkproxyExample;
public class HellowWord implements HellowWordImpl{
@Override
public void SayHellowWord() {
System.out.println("你好啊");
}
}
重点实现
package lJdkproxyExample;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//JDK动态代理
public class JdkproxyExample implements InvocationHandler{
//真实对象
private Object target = null;
/*
* 建立代理对象和真实对象的关系,并返回代理对象
* @param target真实对象
* @return 返回代理
* */
/*
刚开始这块没明白,为什么要有target,而还要返回obj,后来删除测试懂了,在测试时候,生成HellowWord对象的时候,需要返回,而在invoke里需要用到invoke
*/
public Object bind(Object target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
/*
* @param proxy 代理对象
* param method 当前调度方法
* param args 当前方法参数
* return 代理结果返回
* @throws Throwable 异常
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("进入当前逻辑方法");
System.out.println("在调度真实对象之前的服务");
Object obj = method.invoke(target, args);//相等于调用syshellowword的方法
System.out.println("在调度对象之后的服务");
return obj;
}
}
/*
测试,好使
*/
package lJdkproxyExample;
public class TestJdkproxyExmple {
public static void main(String[] args) {
JdkproxyExample j = new JdkproxyExample();
//绑定关系,因挂在HellowWord下,所以代理对象hellowWord proxy
HellowWordImpl proxy =(HellowWordImpl) j.bind(new HellowWord());
proxy.SayHellowWord();
}
}
---------------------------------------------------------------------------------------分割线,输出结果-----------------------------------------------------------------------------------------------------------------
进入当前逻辑方法
在调度真实对象之前的服务
你好啊
在调度对象之后的服务
我觉得把,这个动态代理,就是在调用的时候用一个代理类,这个类一边执行额外的逻辑业务,就是invoke方法,一边返回那个类的实例就是上面的bind方法
但是有个问题,比如在接口中添加一个方法,在实现类中实现,它不好使,算了,先学着