1.项目结构:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TUPpXSU1UeVRVT4FEVkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jN5ATM0UjM3EDMyEDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2.代码:
1.PersonService.java接口
package com.aop.service;
public interface PersonService {
public void save(String name);
public void update(String name,Integer personid);
public String getPersonName(Integer personid);
}
2.PersonServiceImpl.java实现类
package com.aop.service.impl;
import com.aop.service.PersonService;
public class PersonServiceImpl implements PersonService{
private String user =null;
public PersonServiceImpl() {
}
public PersonServiceImpl(String user) {
this.user = user;
}
public String getUser() {
return user;
}
@Override
public void save(String name) {
System.out.println("我是save");
}
@Override
public void update(String name, Integer personid) {
System.out.println("update");
}
@Override
public String getPersonName(Integer personid) {
System.out.println("getPersonName");
return "qqqqq";
}
}
3.核心代理工厂JDKProxyFactory.java,继承InvocationHandler接口,实现invoke方法
package com.aop.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.aop.service.impl.PersonServiceImpl;
//继承InvocationHandler,实现invoke
public class JDKProxyFactory implements InvocationHandler{
//对象
private Object targetObject;
//获取代理对象
public Object createProxyInstance(Object targetObject){
this.targetObject = targetObject;
/*loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上,此调用invoke方法*/
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this);
}
/*proxy: 指代我们所代理的那个真实对象
method: 指代的是我们所要调用真实对象的某个方法的Method对象
args: 指代的是调用真实对象某个方法时接受的参数*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代理内处理真实操作,user==null 返回null不执行方法,否则传递参数调用方法
PersonServiceImpl impl = (PersonServiceImpl) this.targetObject;
Object result = null;
if(impl.getUser() != null)
{
result = method.invoke(targetObject, args);
}
return result;
}
}
4.测试AOPTest.java
package com.aop.aop;
import static org.junit.Assert.*;
import org.junit.Test;
import com.aop.service.PersonService;
import com.aop.service.impl.PersonServiceImpl;
public class AOPTest {
@Test
public void test() {
JDKProxyFactory jdkpf = new JDKProxyFactory();
PersonService ps = (PersonService) jdkpf.createProxyInstance(new PersonServiceImpl("11"));
ps.save("888");
}
}
3.结果
输出:我是save 改
PersonService ps = (PersonService) jdkpf.createProxyInstance(new PersonServiceImpl());
无输出。