java动态代理实现针对的类要有实现接口
package com.example.aop;
public interface BusinessService {
public void login(String name, String password);
public void find();
}
package com.example.aop;
public class BusinessServiceImpl implements BusinessService{
@Override
public void login(String name, String password) {
System.out.println("name: "+ name + ", password: "+ password);
}
@Override
public void find() {
System.out.println("find..........");
}
}
package com.example.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogInvocationHandler implements InvocationHandler {
private static final Logger logger = LoggerFactory.getLogger(LogInvocationHandler.class);
private Object target;
private Object proxy;
private LogInvocationHandler(){}
private static Map<Class<?>, LogInvocationHandler> map = new HashMap<>();
@SuppressWarnings("unchecked")
public static <T> T getProxyInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException {
LogInvocationHandler handler = map.get(clazz);
if (null == handler) {
handler = new LogInvocationHandler();
T target = clazz.newInstance();
handler.setTarget(target);
handler.setProxy(Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), handler));
map.put(clazz, handler);
}
return (T) handler.getProxy();
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args);
logger.info("invoke: " + method.getName() + " args: " + (null == args ? null : Arrays.toString(args)) + " result:"+ result);
return result;
}
public void setTarget(Object target) {
this.target = target;
}
public void setProxy(Object proxy) {
this.proxy = proxy;
}
public Object getTarget() {
return target;
}
public Object getProxy() {
return proxy;
}
}
package com.example.aop;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestAop {
private static final Logger logger = LoggerFactory.getLogger(TestAop.class);
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
BusinessService bsi = LogInvocationHandler.getProxyInstance(BusinessServiceImpl.class);
bsi.login("tom", "123");
bsi.find();
logger.info("--------------------------------");
WorkService ws = LogInvocationHandler.getProxyInstance(WorkServiceImpl.class);
ws.sleep();
ws.work();
logger.info("--------------------------------");
}
}