1.項目結構:
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());
無輸出。