1、使用动态代理解决代码混乱和代码分散(业务逻辑量大/分散,导致修改的时候需要大量修改)的问题
2、代理类逻辑步骤:
①代理类里面需要使用AOPoperations来定义代理对象
②代理类里面需要使用ClassLoader指定代理对象由哪个类加载器加载
③代理类里面需要使用Class[]指定代理对象的类型
④代理类里面需要使用InvocationHandler的invoke()方法来调用代理对象其中的方法
⑤最后通过返回AOPoperations的newProxyInstance()值,来返回要代理的对象给调用的方法
3、文件
①TestMain.java:测试类
②LoggingProxy.java:动态代理类
③AOPoperations.java:方法接口
④AOPopeartionsImpl.java:实现方法接口的类
4、TestMain.java
package com.demo.sshtest.aop;
public class TestMain {
public static void main(String[] args) {
AOPoperations targetClass = new AOPopeartionsImpl();
//在这里使用动态代理的对象proxy
AOPoperations proxy = new LoggingProxy(targetClass).getLogProxy();
String rsA = proxy.addA("Str1");
System.out.println("main----------rsA:"+rsA);
String rsB = proxy.addB("Str2");
System.out.println("main----------rsB:"+rsB);
}
}
5、LoggingProxy.java
package com.demo.sshtest.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class LoggingProxy {
//要代理的对象
private AOPoperations targetClass;
public LoggingProxy(AOPoperations targetClass){
this.targetClass = targetClass;
}
public AOPoperations getLogProxy(){
AOPoperations proxy = null;
//指定代理对象由哪个类加载器加载
ClassLoader classLoader = targetClass.getClass().getClassLoader();
//指定代理对象的类型,其中存在哪些方法
Class[] interfaces = new Class[]{AOPoperations.class};
//当调用代理对象其中的方法时,该执行的代码
InvocationHandler invocationHandler = new InvocationHandler() {
//proxy : 当前需要返回的哪个代理对象,一般情况下,invoke方法内部不会使用它,不然会死循环
//method : 当前代理对象被调用的方法
//Object[] : 调用方法时传入的参数
@Override
public Object invoke(Object proxy, Method method, Object[] Obj) throws Throwable {
String methodName = method.getName();
//原来需要在各个方法中添加的内容类似的输入
System.out.println("method name:"+methodName+",string:"+Arrays.asList(Obj));
//执行方法
Object result = method.invoke(targetClass, Obj);
//原来需要在各个方法中添加的内容类似的输入
System.out.println("method name:"+methodName+",result:"+result);
return result;
}
};
proxy = (AOPoperations) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
return proxy;
};
}
6、AOPoperations.java
package com.demo.sshtest.aop;
public interface AOPoperations {
public String addA(String str);
public String addB(String str);
}
7、AOPopeartionsImpl.java
package com.demo.sshtest.aop;
public class AOPopeartionsImpl implements AOPoperations{
@Override
public String addA(String str) {
String result = str+"_AAAAAAAAAA";
return result;
}
@Override
public String addB(String str) {
String result = str+"_BBBBBBBBBB";
return result;
}
}
8、项目目录(只需要com.demo.sshtest.aop的文件)
9、demo
https://download.csdn.net/download/qq_22778717/10476407