静态代理:
主类和代理类都实现了同一个接口,这样代理类在调用方法时,会执行主类的方法
创建接口:
public interface ProxyI {
public void test();
}
创建主类:
public class MainClass implements ProxyI {
@Override
public void test() {
System.out.println(“this is MainProxy”);
}
}
创建代理类:
public class ProxyClass implements ProxyI {
MainClass mainClass;
public ProxyClass(MainClass mainClass) {
this.mainClass = mainClass;
}
@Override
public void test() {
System.out.println(“this is ProxyClass”);
mainClass.test();
}
}
测试:
public static void main(String[] args) {
ProxyClass proxyClass = new ProxyClass(new MainClass());
proxyClass.test();
}
打印结果:
this is ProxyClass
this is MainProxy
缺点:不易扩展,需每次创建代理类
动态代理:
在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,会自动实现代理类。代理对象交给InvocationHandler来管理,代理对象执行的方法都会通过InvocationHandler中的invoke方法来执行。jdk为我们的生成了一个叫$Proxy0(这个名字后面的0是编号,有多个代理类会一次递增)的代理类
public class myproxy implements InvocationHandler{
Object targetobject;
public myproxy(Object object) {
this.targetobject = object;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("begin:proxy");
Object result = method.invoke(targetobject, args);
return result;
}
}
创建主类:
public class myclass implements myint{
public void mytest() {
System.out.println(“my:class”);
}
}
测试方法:
public class test {
public static void main(String[] args) {
myint mc = new myclass();
InvocationHandler in = new myproxy(mc);
myint mcnew = (myint) Proxy.newProxyInstance(myclass.class.getClassLoader(),myclass.class.getInterfaces(), in);
mcnew.mytest();
}
}
打印结果:
begin:proxy
my:class
AOP切面编程:
spring配置:
xml:
<aop:config>
<aop:aspect id="inter" ref="inter">
<aop:pointcut expression="execution(* intclass.inter.*(..))" id="addtime"/>
<aop:before method="timebefore" pointcut-ref="addtime"/>
<aop:after method="timeafter" pointcut-ref="addtime"/>
</aop:aspect>
</aop:config>
interface:
public interface inter {
public void test();
}
class:
public class int1 implements inter{
@Override
public void test() {
System.out.println("int1");
}
}
public class int2 implements inter {
@Override
public void test() {
System.out.println("int2");
}
}
代理类:
public class testint {
public void timebefore(){
System.out.println(“before:”+System.currentTimeMillis());
}
public void timeafter(){
System.out.println("after:"+System.currentTimeMillis());
}
}
测试类:
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(“ApplicationContext.xml”);
inter int1 = (inter) ac.getBean(“int1”);
int1.test();
}