JAVA AOP 带参数 实现 (简版)

=======Java代码

package org.rain.aop;

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

interface SmallRainTargetInterface {
	void doThing();
	void doThingArgs(String[] args);
}

class SmallRainTargetImplementation implements SmallRainTargetInterface {
	@Override
	public void doThing() {
		System.out.println("逻辑代码调用");
	}

	@Override
	public void doThingArgs(String[] args) {
		for (String smallrainArg : args) {
			System.out.println("逻辑代码调用入参:" + smallrainArg);
		}
	}
}

class SmallRainInvocationHandler implements InvocationHandler {
	private Object target;

	public SmallRainInvocationHandler(Object target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		long smallrainStart = System.currentTimeMillis();
		System.out.println("代码开始时间:" + smallrainStart);

		Object result = method.invoke(target, args);

		long smallrainStop = System.currentTimeMillis();
		System.out.println("代码结束时间:" + smallrainStop);

		System.out.println("代码执行时间:" + (smallrainStop - smallrainStart));

		return result;
	}
}

public class SmallRainAOP {
	public static void main(String[] args) {
		SmallRainTargetInterface smallraintarget = new SmallRainTargetImplementation();

		SmallRainTargetInterface smallrainproxy = (SmallRainTargetInterface) Proxy.newProxyInstance(
				smallraintarget.getClass().getClassLoader(), smallraintarget.getClass().getInterfaces(),
				new SmallRainInvocationHandler(smallraintarget));
		//不带参数
		smallrainproxy.doThing();
		//带参数
		String[] smallrainArg = new String[10];
		for (int i = 0; i < 10; i++) {
			smallrainArg[i] = "入参【" + i + "】";
		}
		smallrainproxy.doThingArgs(smallrainArg);
		
		//不带参数,和上面的doThing()方法相比放到这里通过执行时间可以清晰看到初始化是很费时的!!
		smallrainproxy.doThing();
	}
}

你可能感兴趣的:(java,开发语言)