代理技术
公共类对象
接口对象
package main;
public interface Hello {
void say(String name);
}
接口对象实现类
package main;
public class HelloImpl implements Hello{
@Override
public void say(String name) {
System.out.println("hello "+name);
}
}
静态代理
静态代理是在每个实现类的前后加上一个方法用于对该方法的性能进行监控。
代理对象类
package juntil;
import main.Hello;
import main.HelloImpl;
/**
* 静态代理
* @author yong
*
*/
public class HelloStaticProxy implements Hello{
private Hello hello;
public HelloStaticProxy(){
this.hello = new HelloImpl();
}
@Override
public void say(String name) {
before();
hello.say(name);
after();
}
private void after() {
System.out.println("After");
}
private void before() {
System.out.println("Before");
}
}
测试
@Test
public void StaticProxy() {
HelloStaticProxy helloProxy = new HelloStaticProxy();
helloProxy.say("大明");
}
Before
hello 大明
After
jdk动态代理
局限性:只能代理有接口的类。
package juntil;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 动态代理
* @author yong
*
*/
public class DynamicProxy implements InvocationHandler{
private Object target;
public DynamicProxy(Object target){
this.target = target;
}
@SuppressWarnings("unchecked")
public <T>T getProxy(){
return (T)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target, args);
after();
return result;
}
private void after() {
System.out.println("After");
}
private void before() {
System.out.println("Before");
}
}
测试
@Test
public void DynamicProxyTest(){
DynamicProxy dynamicProxy = new DynamicProxy(new HelloImpl());
Hello helloProxy = dynamicProxy.getProxy();
helloProxy.say("小芳");
}
Before
hello 小芳
After