动态代理 Proxy InvocationHandler学习

原创 2013年12月04日 09:50:40

该实例是模拟安全性检查

 

被代理对象接口定义

public interface UserManager {
	public void aadUser(User user);
	public void deleteById(int id);
	public void updateUser(User user);
	public User findById(int id);
}

 

被代理对象接口实现

public class UserManagerImp implements UserManager {
	@Override
	public void aadUser(User user) {
		System.out.println("----------addUser------------");
	}
	@Override
	public void deleteById(int id) {
		System.out.println("----------deleteById------------");
	}
	@Override
	public User findById(int id) {
		System.out.println("----------findById------------");
		return null;
	}
	@Override
	public void updateUser(User user) {
		System.out.println("----------updateUser------------");
	}
}

 

 定义一个user对象

public class User {
	private int id;
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
}

 

 继承InvocationHandler接口

package hb.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/*
 * 1、动态代理类一定要实现InvocationHandler接口,就要实现invoke()方法
 */
public class SecurityHandler implements InvocationHandler {
	private Object targetObject;
	/*
	 * 下面方法是得到代理对象,如果得不到代理对象,这个效果也是没有作用的
	 * 最后一个参数是InvocationHandler接口,这也是为什么动态代理对象一定要实现这个接口的原因
	 * 得到的代理对象会执行invoke()方法
	 */
	public Object newProxy(Object targetObject){
		this.targetObject = targetObject;
		//得到代理对象的方法,这个是反射机制里面的对象方法
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
									  targetObject.getClass().getInterfaces(),
									  this);
	}
	/*
	 * 在代理对象之前做业务处理,然后再做对象定义的方法,因此最后要返回代理的对象
	 */
	@Override
	public Object invoke(Object proxcy, Method method, Object[] args)
			throws Throwable {
		if("aadUser".equals(method.getName())){
			System.out.println("method is aadUser");
			checkSecurity();
		}else{
			System.out.println("method is nod aadUser");
		}
		return method.invoke(this.targetObject, args);
	}
	
	public void checkSecurity(){
		System.out.println("-----------checkSecurity()----------");
	}
}

 

 

 测试代码

public class TestMain{
	public static void main(String[] args) {
		//产生一个安全代理的对象方法
		SecurityHandler handler = new SecurityHandler();
		//得到一个已经被代理的对象
		UserManager userManager = (UserManager)handler.newProxy(new UserManagerImp());
		
		User user = new User();
		user.setAge(23);
		user.setId(1);
		user.setName("huangbiao");
		//被代理对象做数据业务之前会先调用invoke()方法
		userManager.aadUser(user);
	}
}

 

java 动态代理学习(Proxy,InvocationHandler)——自己的理解

前几天看到java的动态代理机制,不知道是啥玩意,然后看了看。死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这...

Proxy,InvocationHandler动态代理学习笔记

动态代理的作用显而易见,比如AOP,可以在执行的你方法之前及之后做一些事情,比如事物的开启及关闭,日志的记录等等,最典型的例子莫过于Spring的AOP了... 在JDK中,Proxy  和 Inv...

java 动态代理学习(Proxy,InvocationHandler)

原帖地址:点击打开链接 前几天看到java的动态代理机制,不知道是啥玩意,然后看了看。死活不知道  invoke(Object proxy, Method m, Object[] args)种的p...

java 动态代理深度学习(Proxy,InvocationHandler)

java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy, Proxy 提供用于创建动态代理类和实例的静态方法. newProxyInstan...
  • qhrking
  • qhrking
  • 2014年06月10日 17:38
  • 1061

java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码

原帖地址:点击打开链接 java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy, Proxy 提供用于创建动态代...

Java动态代理的源码分析;Proxy与InvocationHandler

代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问。 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念。 代理模式示例代码 pub...

JDK的动态代理深入解析(Proxy,InvocationHandler)

http://www.cnblogs.com/duanxz/archive/2012/12/03/2799504.html JDK的动态代理深入解析(Proxy,InvocationHand...

JDK的动态代理深入解析(Proxy,InvocationHandler)

调用处理器InvocationHandler,与被代理类(委托类)的实例想关联。  动态代理构造实例时必须和调用处理器InvocationHandler相关联,它不会替你作实质性的工作,在生成它...

JDK的动态代理深入解析(Proxy,InvocationHandler)(转)

JDK的动态代理深入解析(Proxy,InvocationHandler)(转) 博客分类:  Java SE   调用处理器InvocationHandler,与被代理类...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态代理 Proxy InvocationHandler学习
举报原因:
原因补充:

(最多只允许输入30个字)