1. MyProxy.java
package my.java.proxy;
import java.lang.reflect.Proxy;
import java.util.Date;
public class MyProxy {
public static void main(String[] args) {
MessageService messageService = new MessageServiceImpl();
MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
myInvocationHandler.setTarget(messageService);
//通过Proxy的静态方法 newProxyInstance 获取代理对象 是个代理
//第一个参数 是被代理的对象的classloader
//第二个参数 是被代理的对象实现的接口
//第三个参数 是自己实现的 InvocationHandler
MessageService target = (MessageService) Proxy.newProxyInstance(
messageService.getClass().getClassLoader(),
messageService.getClass().getInterfaces(),
myInvocationHandler);
//代理对象拥有被代理对象的所有方法 这里代理的是messageServiceImpl对象
//执行代理对象target的方法,会执行myInvocationHandler的invoke方法
System.out.println("结果 : " + target.findAll());
System.out.println("结果 : " + target.updateMessage(new Message(1,"123",new Date())));
}
}
执行结果
findAll-----方法执行前-----
查询成功
findAll-----方法执行后-----
结果 : null
updateMessage-----方法执行前-----
更新成功
updateMessage-----方法执行后-----
结果 : 1
2. MyInvocationHandler.java
package my.java.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
//被代理的对象 也就是底层对象 也就是实例化的对象
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//proxy : 是代理对象 是个代理 method 是调用的方法 args 是方法的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//操作Proxy 可以更好的理解proxy 实际在这里用不到
/*System.out.println(proxy.getClass());
System.out.println(proxy.getClass().getName());
Method[] method2 = proxy.getClass().getDeclaredMethods();
for(Method method3 : method2){
System.out.println(method3);
}
System.out.println("--------------------------------------");
System.out.println(method.getName());
System.out.println("---------------------------------------");
for(Object object : args){
System.out.println(object);
}*/
MessageLog log = new MessageLog();
log.before(method.getName());
//method 的invoke方法 两个参数 第一个是被代理的对象, 第二个是参数
//返回值 执行方法的返回值
Object ret = method.invoke(target, args);
log.after(method.getName());
return ret;
}
}
3. MessageLog.java
package my.java.proxy;
public class MessageLog {
public void before(String methodName){
System.out.println(methodName + "-----方法执行前-----");
};
public void after(String methodName){
System.out.println(methodName + "-----方法执行后-----");
};
}
4. Message.java
package my.java.proxy;
import java.util.Date;
public class Message {
private int id;
private String description;
private Date createCreate;
public Message() {
super();
}
public Message(int id, String description, Date createCreate) {
super();
this.id = id;
this.description = description;
this.createCreate = createCreate;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getCreateCreate() {
return createCreate;
}
public void setCreateCreate(Date createCreate) {
this.createCreate = createCreate;
}
@Override
public String toString() {
return "Message [id=" + id + ", description=" + description + ", createCreate=" + createCreate + "]";
}
}
5. MessageService.java
package my.java.proxy;
import java.util.List;
public interface MessageService {
public List<Message> findAll();
public Integer updateMessage(Message message);
public Integer insertMessage(Message message);
public Integer deleteMessage(Integer id);
}
6. MessageServiceImpl.java
package my.java.proxy;
import java.util.List;
public class MessageServiceImpl implements MessageService {
private MessageDao messageDao = new MessageDao();
@Override
public List<Message> findAll() {
messageDao.findAll();
return null;
}
@Override
public Integer updateMessage(Message message){
messageDao.updateMessage(message);
return message.getId();
}
@Override
public Integer insertMessage(Message message){
messageDao.insertMessage(message);
return message.getId();
}
@Override
public Integer deleteMessage(Integer id){
messageDao.deleteMessage(id);
return id;
}
}
7. MessageDao.java
package my.java.proxy;
import java.util.List;
public class MessageDao {
public List<Message> findAll(){
System.out.println("查询成功");
return null;
}
public Integer updateMessage(Message message){
System.out.println("更新成功");
return null;
}
public Integer insertMessage(Message message){
System.out.println("新增成功");
return null;
};
public Integer deleteMessage(Integer id){
System.out.println("删除成功");
return null;
};
}