# Java高级之动态代理和AOP **Repository Path**: fpfgitmy_admin/java-high-proxy-aop ## Basic Information - **Project Name**: Java高级之动态代理和AOP - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 动态代理与AOP ![输入图片说明](https://images.gitee.com/uploads/images/2021/0428/115409_62dc17c8_1942182.png "屏幕截图.png") ``` package com.felixfei.study.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @describle 动态代理的举例 */ interface Human { String getBelief(); void eat(String food); } // 被代理类 class SuperMan implements Human { @Override public String getBelief() { return "I believe I can fly!"; } @Override public void eat(String food) { System.out.println("我喜欢吃" + food); } } /** * 要想实现动态代理:需要解决的问题? * 问题一:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象 * 问题二:当通过代理类的对象调用方法时,如何动态的去调用被代理类中的同名方法 */ class ProxyFactory { // 调用此方法,返回一个代理类的对象。解决问题一 public static Object getProxyInstance(Object obj) {// obj:被代理类的对象 MyInvocationHandler myInvocationHandler = new MyInvocationHandler(); myInvocationHandler.bind(obj); // 第二个参数的意思:因为被代理类和代理类要实现同样的接口 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), myInvocationHandler); } } class MyInvocationHandler implements InvocationHandler { // 赋值时,需要使用被代理类的对象进行赋值 private Object obj; public void bind(Object obj) { this.obj = obj; } // 当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法,invoke() // 将被代理类要执行的方法a的功能就声明在invoke()中 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { HumanUtil util = new HumanUtil(); // 切面的方法1 util.method1(); // method:即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法 // obj:被代理类的对象 Object value = method.invoke(obj, args); // 上述方法的返回值 // 切面的方法 2 util.method2(); return value; } } public class ProxyTest { public static void main(String[] args) { SuperMan superMan = new SuperMan(); // 代理类的对象 Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan); // 当通过代理类对象调用方法时,会自动的调用被代理类中的同名方法 String belief = proxyInstance.getBelief(); System.out.println(belief); proxyInstance.eat("果子"); System.out.println("*********************"); // 动态?:代理类动态 // 只需要提供代理类,就能代理被代理类 NikeClothFactory nikeClothFactory = new NikeClothFactory(); ClothFactory proxyInstance1 = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory); proxyInstance1.produceCloth(); } } class HumanUtil { public void method1() { System.out.println("==============通用方法1=============="); } public void method2() { System.out.println("==============通用方法1=============="); } } ```