java动态代理

java的动态代理可分为:

1.  JDK的动态代理。

a: 涉及Proxy和InvocationHandler两个类。

b: 需要目标类实现接口。

2. cglib的动态代理。

       a: 需要引入第三方的cglib-2.1.3.jar包。

       b:涉及Enhancer和MethodInterceptor两个类。

       c: 原理是动态的给目标类构建一个子类,来代理目标类,所以无法代理声明为final的目标类。



-------------------------------------------------------------------------------jdk动态代理--------------------------------------------------

Person.java

package proxy.jdk;


public interface Person
{
	void show(String str);
}

Father.java

package proxy.jdk;

public class Father implements Person
{

	@Override
	public void show(String str)
	{
		System.out.println("This is Father");
		
	}
	
}

PersonProxy.java

package proxy.jdk;

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

public class PersonProxy implements InvocationHandler
{
	Object target;

	public Object bind(Object target)
	{
		this.target = target;

		// 取得代理对象
		return Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable
	{
		System.out.println("先做些准备工作");
		Object result = method.invoke(target, args);
		System.out.println("扫尾工作");
		return result;
	}

}
Test.java

package proxy.jdk;

public class Test
{
	public static void main(String[] args) throws Exception
	{
		PersonProxy proxy = new PersonProxy();
		Person person = (Person)proxy.bind(new Father());
		person.show("代理");
	}
}




-----------------------------------------------------------------------------------------------------cglib动态代理------------------------------------

Father.java

package proxy.cglib;

public class Father
{
	public void show()
	{
		System.out.println("cglib 动态代理 this is father");
	}
}

PersonProxy.java

package proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * 需要导入cglib-2.1.3.jar
 * @author xiongwenhua
 *
 */
public class PersonProxy implements MethodInterceptor
{
	Object target;

	public Object bind(Object target)
	{
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		// 回调方法
		enhancer.setCallback(this);
		// 创建代理对象
		return enhancer.create();
	}

	@Override
	public Object intercept(Object object, Method method, Object[] args,
			MethodProxy proxy) throws Throwable
	{

		System.out.println("事物开始");
		 proxy.invokeSuper(object, args);
		System.out.println("事物结束");

		return null;
	}

}
Test.java

package proxy.cglib;

public class Test
{
	public static void main(String[] args)
	{
		PersonProxy proxy = new PersonProxy();
		Father father = (Father)proxy.bind(new Father());
		father.show();
	}
}

---------------------------------------------------------------------------------------------------------------------------------------------


你可能感兴趣的:(java动态代理)