Java 动态代理(三)

例子二:

package com.test.DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 动态代理ArrayList、HashMap
 * @author 守望幸福
 *
 */
public class DemoTwo implements InvocationHandler {
	
	private Object obj;//代理对象
	
	public DemoTwo(Object obj) {
		this.obj = obj;
	}
	
	public static Object factory(Object obj){
		Class<?> classType=obj.getClass();//获取被代理对象的类型
		return Proxy.newProxyInstance(classType.getClassLoader(), classType.getInterfaces(), new DemoTwo(obj));
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("--------------调用方法前--------------");
		Object rObj=method.invoke(obj, args);
		for(Object o : args){
			System.out.println(o);//输出传入的参数
		}
		System.out.println("--------------调用方法后--------------");
		return rObj;
	}
	/**
	 * 测试
	 * @param args
	 */
	@SuppressWarnings({"unchecked","rawtypes"})
	public static void main(String[] args) {
		
		List list=(List)factory(new ArrayList());//ArrayList实现了List接口,将ArrayList传入代理类初始化代理对象
		System.out.println(list.getClass());//代理对象
		list.add("zhangsan");
		list.add("lisi");//代理ArrayList中的add方法,会调用invoke方法。
		list.remove(0);//代理arrayList中的remove方法
		Map map=(Map) factory(new HashMap());
		map.put("name","张三");
		
	}
}

你可能感兴趣的:(java)