动态代理:动态生成代理类
java.lang.reflect.Proxy 作用:动态生成代理类和对象
java.lang.reflect.Invocation.Handler(处理器接口)
可以通过invoke方法实现对真实角色的代理访问,每次通过Proxy生成代理类对象时都要指定处理器接口
使用JDK动态代理步骤:
①创建被代理的接口和类;
②创建InvocationHandler接口的实现类,在invoke方法中实现代理逻辑;
③通过Proxy的静态方法newProxyInstance( ClassLoaderloader, Class[] interfaces, InvocationHandler h)创建一个代理对象
④使用代理对象。
实例分析如下:
被代理的接口
package com.bjsxt.proxy.staticProxy;
public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void signContract();
/**
* 订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMoney();
}
被代理类
真实类
package com.bjsxt.proxy.staticProxy;
public class RealStar implements Star {
@Override
public void bookTicket() {
System.out.println("RealStar.bookTicket()");
}
@Override
public void collectMoney() {
System.out.println("RealStar.collectMoney()");
}
@Override
public void confer() {
System.out.println("RealStar.confer()");
}
@Override
public void signContract() {
System.out.println("RealStar.signContract()");
}
@Override
public void sing() {
System.out.println("RealStar(周杰伦本人).sing()");
}
}
创建InvocationHandler接口的实现类StarHandler类
package com.zhb.jdk.dynamicProxy;
import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class StarHandler implements InvocationHandler {
Star realStar;
public StarHandler(Star realStar){
super();
this.realStar=realStar;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object=null;
System.out.println("面谈,签合同,预付款,订机票");
if(method.getName().equals("sing")){
object=method.invoke(realStar,args);
}
System.out.println("收尾款");
return object;
}
}
通过Proxy的静态方法创建代理对象并使用代理对象
package com.zhb.jdk.dynamicProxy;
import java.lang.reflect.Proxy;
public class Client{
public static void main(String[] args) {
Star realStar=new realStar();
StarHandler handler = new StarHandler(realStar);
//第一个参数是指定代理类的类加载器(我们传入当前测试类的类加载器)
//第二个参数是代理类需要实现的接口(我们传入被代理类实现的接口,这样生成的代理类和被代理类就实现了相同的接口)
//第三个参数是invocation handler,用来处理方法的调用。这里传入我们自己实现的handler
Star proxy = (RealStar) Proxy.newProxyInstance(ClassLoader.getClassLoader(),new Class[]{Star.class}, handler);
proxy.sing();
}
}
打印结果:
面谈,签合同,预付款,订机票
RealStar(周杰伦本人).sing()
收尾款
在Client中再加一段代码proxy.bookTicket();
proxy调用这两个方法都会进入StarHander类中invoke方法中去执行一遍
输出结果为:
面谈,签合同,预付款,订机票
RealStar.bookTicket()
收尾款
面谈,签合同,预付款,订机票
RealStar(周杰伦本人).sing()
收尾款