今天看了一下同事的面试题,有一个是当你做好了一个功能,在不改变现在程序使用的情况下,我想在这个功能上增加功能怎么办?
答案是:动态代理。。
个人理解:增加功能的应该是一个全新的对象。比如现在做一个关于人的功能。只实现了学生,现在增加了一个老师的功能,而不是现在有交钱的功能,要拓展一个其他功能。
动态代理可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
接口:
package T_Proxy;
public interface Person {
void getMoney();
void getName();
}
接口实现类:
package T_Proxy;
public class Student implements Person{
private String name;
public Student(String name) {
this.name=name;
}
@Override
public void getMoney() {
System.out.println(name+"交了60");
}
@Override
public void getName() {
System.out.println(name);
}
}
实现invocationHander类
package T_Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class StudentInvok<T> implements InvocationHandler {
private T t;
public StudentInvok(T t){
this.t=t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(proxy.getClass().getName()+"进入");
Object invoke = method.invoke(t, args);
return invoke;
}
}
测试类:
package T_Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
//接口 实现类
Person p=new Student("张三");
// 实现invocationHandler的实现类
InvocationHandler ivh=new StudentInvok<Person>(p);
Person newProxyInstance = (Person)Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[] {Person.class}, ivh);
newProxyInstance.getName();
}
}
利用Proxy的newProxyInstance方法来创建代理对象(个人理解---)
第一个参数:需要代理类的类加载器,一般写法 object.class.getClassLoader();
第二个参数:需要克隆该对象的接口
第三个参数::动态代理的对象(invocationHandler的实现类)
下一步:调用方法;(当到了这一步的时候底层会去调用invocationHandler的实现类的invoke方法)