需要实现 InvocationHandler接口
被代理类必须要实现自己的接口
特点:JDK实现动态代理需要实现类通过接口定义业务方法,
内部通过反射来实现代理功能,提高代码健壮性
实现方式一:
Service.java
interface Service {
void sendmessage1 ();
void sendmessage2 ();
}
ServiceImpl.java
class ServiceImpl implements Service {
public void sendmessage1 () {
System.out.println("send message1");
}
public void sendmessage2 () {
System.out.println("send message2");
}
}
MyProxy.java
public class MyProxy<T> implements InvocationHandler {
T target;
public T getProxy (T target) {
this.target = target;
return (T) java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start exec proxy ---");
Object result = method.invoke(target,args);
System.out.println("end exec proxy ---");
return result;
}
}
Test.java
public static void main(String[] args) {
MyProxy<Service> objectProxy = new MyProxy<>();
Service proxy = objectProxy.getProxy(new ServiceImpl());
proxy.sendmessage1();
proxy.sendmessage2();
}
console
start exec proxy ---
send message1
end exec proxy ---
start exec proxy ---
send message2
end exec proxy ---
实现方式二
public class Mytest {
public static void main1(String[] args) {
Service service = new Service() {
@Override
public void sendmessage1() {
System.out.println("send message1");
}
@Override
public void sendmessage2() {
System.out.println("send message2");
}
};
Service o = (Service)java.lang.reflect.Proxy.newProxyInstance(service.getClass().getClassLoader(),
service.getClass().getInterfaces(), (object, method, argus) -> {
System.out.println("start proxy");
Object invoke = method.invoke(service, args);
System.out.println("end proxy");
return invoke;
});
o.sendmessage1();
}
}
interface Service {
void sendmessage1 ();
void sendmessage2 ();
}