1. 程式人生 > 其它 >華為機試演算法題

華為機試演算法題

技術標籤:JAVAEE企業級應用開發教程

什麼是AOP?
將分散在各個方法中重複的程式碼提取出來,然後在程式編譯或執行時,再將這些提取出來的程式碼應用到需要執行的地方
AOP術語
點選此處學習AOP術語
在切面覆蓋下的類裡面,任何物件方法的呼叫都被叫做連線點
切面 只是一個類,但是這個類只有在Spring容器中被配置才能被識別為切面
切入點就是 需要處理的連線點
通知增強處理就是 切入點需要執行的程式程式碼,就是切面類中的某個方法
目標物件就是 執行了切面類中方法的一個類。
代理是 在“動態的AOP”方法中,被動態建立的虛擬物件。
織入也就是 生成代理物件的過程

在這裡插入圖片描述

在這裡插入圖片描述

package com.
csdn2.AOP; public interface UserDao { public void add(); public void delete(); }
package com.csdn2.AOP;

public class UserDaoImplement implements UserDao{

	@Override
	public void add() {
		// TODO Auto-generated method stub
		System.out.println("com.csdn2.AOP.UserDaoImplement:新增方法");
	}
@Override public void delete() { // TODO Auto-generated method stub System.out.println("com.csdn2.AOP.UserDaoImplement:刪除方法"); } }
package com.csdn2.AOP;

public class Aspect {
	public void check() {
		System.out.println("com.csdn2.AOP.Aspect:模擬檢查操作......");
	}
	public
void log() { System.out.println("com.csdn2.AOP.Aspect:模擬記錄操作......"); } }
package com.csdn2.AOP;

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

public class JdkProxy implements InvocationHandler{

	//宣告目標物件
	UserDao userDao;
	public Object createProxy(UserDao userDao) {
		this.userDao=userDao;
		//1、類載入器
		ClassLoader classLoader=JdkProxy.class.getClassLoader();
		//2、被代理物件所有介面
		Class[] clazz=userDao.getClass().getInterfaces();
		//3、使用代理類,進行增強,返回的是代理後的物件
		return Proxy.newProxyInstance(classLoader, clazz, this); 
	}
	//所有動態代理類的方法呼叫,都會交由invoke()方法去處理
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		//1、宣告切面
		Aspect aspect=new Aspect();
		//2、前增強
		aspect.check();
		//3、再在目標類上呼叫方法,並傳入引數
		Object obj=method.invoke(userDao, args);
		//3、後增強
		aspect.log();
		return obj;
	}

}
package com.csdn2.AOP;

public class JdkTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//建立代理物件
		JdkProxy jdkProxy=new JdkProxy();
		//建立目標物件
		UserDao userDao=new UserDaoImplement();
		//從代理物件中獲取增強後的目標物件
		UserDao userDao2=(UserDao)jdkProxy.createProxy(userDao);
		//執行方法
		userDao2.add();
		System.out.println();
		userDao2.delete();
	}

}

執行結果
在這裡插入圖片描述