java中的动态代理和面向切面编程(可以体现动态代理的优势)

java中的动态代理和面向切面编程(可以体现动态代理的优势)

下边内容来自书籍:疯狂java讲义









扫描二维码关注公众号,回复: 1483580 查看本文章






代码如下:

package 动态代理.ProxyAndAOP;

public interface Dog {
	// info方法声明
	public void info();

	// run方法声明
	public void run();
}
package 动态代理.ProxyAndAOP;

public class GunDog implements Dog{

	@Override
	public void info() {
		// TODO Auto-generated method stub
		System.out.println("我是一只猎狗");
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("迅速奔跑");
	}

}
package 动态代理.ProxyAndAOP;

public class DogUtils {
//第一个拦截方法
	public void method1(){
		System.out.println("模拟第一个通用方法-------------------------------");
	}
	//第二个拦截方法
	public void method2(){
		System.out.println("-------------------------------模拟第二个通用方法");
	}
}
package 动态代理.ProxyAndAOP;

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

	// 执行动态代理所有方法时,都会变成执行一下的invoke方法
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method st
		DogUtils du = new DogUtils();
		// 执行DogUtils对象中的method1
		du.method1();
		// 下边以target作为主调来执行method方法
		Object result = method.invoke(target, args);
		// 执行DogUtils对象中的method2
		du.method2();

		return result;
	}

}
package 动态代理.ProxyAndAOP;

import java.lang.reflect.Proxy;

import 动态代理.Dog;

public class MyProxyFactory {
	// 为指定的target生成动态代理对象
	public static Object getProxy(Object target) {
		// 创建一个MyInvocationHandler对象
		MyInvocationHandler handler = new MyInvocationHandler();
		// 为MyInvocationHandler设置target对象
		handler.setTarget(target);
		// 创建并返回一个动态代理
//		newProxyInstance(target.getClass().getClassLoader(), target.getClass(), handler);
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),handler);
				

	}
}
package 动态代理.ProxyAndAOP;

public class Test {
public static void main(String[] args) {
	//创建一个原始的GunDog对象作为target
	Dog target=new GunDog();
	//以指定的target来创建动态代理
	Dog dog=(Dog) MyProxyFactory.getProxy(target);
	dog.info();
	dog.run();
}
}

控制台输出如下:






猜你喜欢

转载自blog.csdn.net/Handsome2013/article/details/80583989