静态代理和jdk动态代理
1.静态代理
1.1共有接口
1.2目标类(实现共有接口)
1.3静态代理类(实现共有接口):在实现接口的方法中增加功能
2.jdk动态代理(invocationhandler和proxy)
//接口
public interface Student {
public void say();
}
//接口的实现类
public class StudentImpl implements Student {
@Override
public void say() {
System.out.println("Hello World");
}
}
//动态代理实现类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
//传入目标类根据目标类的classloader和实现的接口,创建动态代理对象
public Object getProxy(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
//动态代理对象调用方法时会把自身
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("say".equals(method.getName())) {
System.out.println("开启日志");
Object result = method.invoke(target,args);
System.out.println("提交");
return result;
}else {
Object result = method.invoke(target,args);
return result;
}
}
}
//主方法测试
import com.tang.proxy.MyInvocationHandler;
import com.tang.study.Student;
import com.tang.study.StudentImpl;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args ) {
MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
Student proxy = (Student) myInvocationHandler.getProxy(new StudentImpl());
proxy.say();
}
}