java 动态代理

本文介绍了一个使用Java动态代理创建的简单示例。通过MyProxy类和MyInvocationHandler类实现了对MessageService接口的代理,展示了如何利用Java反射API来增强方法调用的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
	};
	
}

 

转载于:https://my.oschina.net/u/2490316/blog/897426

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值