Proxy代理简单使用
使用Proxy实现织入额外代码
1.需要先定义接口和被代理类:
public interface UserBean {
String getUser();
String printStr(String name);
}
2.实现类
public class UserBeanImpl implements UserBean {
private String user = null;
public UserBeanImpl(){
}
public UserBeanImpl(String user) {
this.user = user;
}
@Override
public String getUser() {
System.out.println("this is getUser() method!");
return user;
}
public void setUser(String user) {
this.user = user;
}
@Override
public String printStr(String name) {
System.out.println(name);
return name;
}
}
3.定义代理类UserBeanProxy,实现InvocationHandler接口的invoke方法,进行代码织入
public class UserBeanProxy implements InvocationHandler {
/**
* 被代理对象
*/
private Object target;
public UserBeanProxy() {
}
public UserBeanProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//织入代码前置
System.out.println("invoke proxy before biz");
Object a = method.invoke(target, args);
//织入代码后置
System.out.println("invoke proxy after biz");
return a;
}
}
4.测试
public class TestBeanProxy {
public static void main(String[] args) {
//被代理对象
UserBeanImpl target = new UserBeanImple("ABC");
//代理对象
UserBeanProxy proxy = new UserBeanProxy(target);
//创建代理对象实例
Object instance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), proxy);
//这里只能强转为接口
String printStr = ((UserBean)instance).printStr("testArgs");
System.out.println("printStr====" + printStr);
}
}
RPC调用,只是引用了另外一个中心的服务api就能够调用另外一台机器的服务,就是使用了代理来实现底层的网络通信。下面的例子使用了泛型。clz是一个接口类newProxyInstance 的参数 使用了 new Class[]{clz}。如果是具体的实现类,可以使用clz.getInterfaces()来代替。如果入参是一个实例,可以通过target.getClass().getInterface()来处理。
public static <T> T getRpcProxyBean(Class<T> clz){
return (T) Proxy.newProxyInstance(clz.getClassLoader(), new Class[]{clz}, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("实现网络请求逻辑");
return null;
}
});
}
UserFacade userFacade = RpcProxy.getRpcProxyBean(UserFacade.class);
如果需要走一个对象里面的原逻辑,需要先实例化一个对象object(sourceBean)。
public static void main(String[] args) {
TestProxy sourceBean = new TestProxyImpl();
Object testProxy = createProxy2(sourceBean);
String bbb = ((TestProxy)testProxy).printString("bbb");
System.out.println(bbb);
}
public static Object createProxy2(Object object){
Object instance = Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("aaa1");
Object ccc = method.invoke(object,args);
System.out.println("aaa2");
return "ccc";
}
});
return instance;
}