静态代理
package com.staticProxy;
public interface Person {
public void eat();
}
package com.staticProxy;
public class Teacher implements Person{
@Override
public void eat(){
System.out.println("老师也爱吃东西");
}
}
package com.staticProxy;
public class staticProxy implements Person{
private Teacher teacher;
public staticProxy(Teacher teacher){
this.teacher = teacher;
}
@Override
public void eat() {
System.out.println("代理模式");
teacher.eat();
}
}
package com.staticProxy;
public class test {
public static void main(String[] args) {
Teacher teacher = new Teacher();
staticProxy staticProxy = new staticProxy(teacher);
staticProxy.eat();
}
}
动态代理需要反射完成,借鉴AOP思想
package com.dynamicProxy;
public interface Phone {
public String salePhone();
}
package com.dynamicProxy;
public class Apple implements Phone {
@Override
public String salePhone() {
return "销售iPhone手机";
}
}
package com.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
//1、传入委托对象 2、返回代理对象
public Object bind(Object object){
//保存委托对象
this.target = object;
return Proxy.newProxyInstance(
MyInvocationHandler.class.getClassLoader(),
target.getClass().getInterfaces(),
this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理模式");
return method.invoke(target,args);
}
}
package com.dynamicProxy;
public class Test {
public static void main(String[] args) {
//1、创建委托对象
Apple apple = new Apple();
//2、动态创建代理对象
MyInvocationHandler handler = new MyInvocationHandler();
Phone phoneProxy = (Phone) handler.bind(apple);
System.out.println(phoneProxy.salePhone());
}
}
面试官问:怎么做到无侵入的增强方法? 答:代理。肯定是用动态代理啊。类似于切面编程,使用动态代理即可完成对一个或多个方法无侵入的增强。