代理
简单代理
/**
* @author gaorun
* @Description 简单代理
* @create 2021-07-26 9:25
*/
public class ProxyTest {
public static void consumer(InterfaceTest iface) {
iface.something();
iface.somethingElse("bonobo");
}
public static void main(String[] args) {
consumer(new RealObject());
consumer(new SimpleProxy(new RealObject()));
}
}
interface InterfaceTest {
void something();
void somethingElse(String agrs);
}
class RealObject implements InterfaceTest {
@Override
public void something() {
System.out.println("doSomething");
}
@Override
public void somethingElse(String agrs) {
System.out.println("somethingElse " + agrs);
}
}
class SimpleProxy implements InterfaceTest {
private InterfaceTest proxied;
public SimpleProxy(InterfaceTest proxied) {
this.proxied = proxied;
}
@Override
public void something() {
System.out.println("SimpleProxy doSomething");
proxied.something();
}
@Override
public void somethingElse(String agrs) {
System.out.println("SimpleProxy somethingElse " + agrs);
proxied.somethingElse(agrs);
}
}
动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author gaorun
* @Description 动态代理
* @create 2021-07-26 9:34
*/
public class DynamicProxyTest implements InvocationHandler {
private Object proxid;
public DynamicProxyTest(Object proxid) {
this.proxid = proxid;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(String.format("%s %s method:%s args:%s", "**** proxy:****", proxy.getClass(), method,args));
if(args != null) {
for(Object arg : args) {
System.out.println(" " + arg);
}
}
return method.invoke(proxid, args);
}
}
class SimpleDynamicProxy {
public static void consumer(InterfaceTest iface) {
iface.something();
iface.somethingElse("bonobo");
}
public static void main(String[] args) {
RealObject real = new RealObject();
consumer(real);
InterfaceTest itest = (InterfaceTest) Proxy.newProxyInstance(InterfaceTest.class.getClassLoader(),
new Class[]{InterfaceTest.class},
new DynamicProxyTest(real));
consumer(itest);
}
}
限制方法名
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author gaorun
* @Description 限制方法名
* @create 2021-07-26 9:55
*/
public class MethodSelectoro implements InvocationHandler {
private Object proxid;
public MethodSelectoro(Object proxid) {
this.proxid = proxid;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("interesting")) {
System.out.println("Proxy detected the interesting method");
}
return method.invoke(proxid, args);
}
}
interface SomeMethods {
void boring1();
void boring2();
void boring3();
void interesting(String args);
}
class Implementation implements SomeMethods {
@Override
public void boring1() {
System.out.println("boring1");
}
@Override
public void boring2() {
System.out.println("boring2");
}
@Override
public void boring3() {
System.out.println("boring3");
}
@Override
public void interesting(String args) {
System.out.println("interesting: " + args);
}
}
class SelectingMethods {
public static void main(String[] args) {
SomeMethods proxu = (SomeMethods) Proxy.newProxyInstance(
SomeMethods.class.getClassLoader(),
new Class[]{SomeMethods.class},
new MethodSelectoro(new Implementation()));
proxu.boring1();
proxu.boring2();
proxu.boring3();
proxu.interesting("bonobo");
}
}