动态代理是javase中重要的一环,比如说spring框架的aop基本上都是用动态代理实现的。
动态代理也能帮助程序员减少工作量,减少代码的冗余。
但是java本身的动态代理必须是实现了接口的类才能运用代理,这是一个缺点。
接口:
public interface HireHouse { public void hire(); }
接口实现类:
public class HireHouseImpl implements HireHouse { @Override public void hire() { System.out.println("租房"); } }
动态代理实现(反射):
动态代理必须实现InvocationHandler接口,然后重写invoke方法来处理其它事物。
public class DynamicProxy implements InvocationHandler { private Object obj; public DynamicProxy(Object obj) { this.obj = obj; } /** * 动态代理 * 优化代码 * 能将功能相近的一些类的方法 集中到一个动态代理类中进行处理,减少代码冗余。 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置工作"); Object invoke=method.invoke(obj, args); System.out.println("后置工作"); return invoke; } }
动态代理类的实现:
/** * 测试: 动态代理 * 1.声明实体对象 * 2.通过动态代理的方式代理被代理者的所有方法 * 参数 1.获取实体的类加载器,2.获取实体类的所有接口,3.声明代理类并传入需要代理的实体类。 */ @Test public void testDynamicProxy() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { HireHouseImpl hhi=new HireHouseImpl(); HireHouse hireHouse=(HireHouse) Proxy.newProxyInstance(hhi.getClass().getClassLoader(), hhi.getClass().getInterfaces(), new DynamicProxy(hhi)); hireHouse.hire(); }