AOP(注解、反射、代理)詳解
Java 注解
(Annotation)又稱 Java 標注,是 JDK5.0 引入的一種注釋機制,
Java 語言中的類、方法、變數、引數和包等都可以被標注,和 Javadoc 不同,Java 標注可以通過反射獲取標注內容,在編譯器生成類檔案時,標注可以被嵌入到位元組碼中,Java 虛擬機可以保留標注內容,在運行時可以獲取到標注內容 ,
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ TYPE, PARAMETER, ANNOTATION_TYPE })
@Retention(value=RetentionPolicy.RUNTIME)//注解可以被寫入class中
public @interface ClassAnnotation {
public String url() default "/";//注解的屬性
}
import java.lang.reflect.Field;
@ClassAnnotation
public class TestClass1 {
private String url;
public String geturl() {
return this.url;
}
public void seturl(@paramAnnotation String url) {
this.url=url;
}
public static void main(String[] args) throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
// TODO Auto-generated method stub
Class clazz=TestClass1.class;
ClassAnnotation a=(ClassAnnotation)clazz.getAnnotation(ClassAnnotation.class);
System.out.println(a.url());
TestClass1 tc=(TestClass1)clazz.newInstance();
Field f=clazz.getDeclaredField("url");
f.setAccessible(true);
f.set(tc, a.url());
System.out.println(tc.geturl());
}
}
Java 反射
JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制,要想解剖一個類,必須先要獲取到該類的位元組碼檔案物件,而解剖使用的就是Class類中的方法.所以先要獲取到每一個位元組碼檔案對應的Class型別的物件.
反射main方法:
student類:
package fanshe.main;
public class Student {
public static void main(String[] args) {
System.out.println("main方法執行了,,,");
}
}
測驗類:
package fanshe.main;
import java.lang.reflect.Method;
/**
* 獲取Student類的main方法、不要與當前的main方法搞混了
*/
public class Main {
public static void main(String[] args) {
try {
//1、獲取Student物件的位元組碼
Class clazz = Class.forName("fanshe.main.Student");
//2、獲取main方法
Method methodMain = clazz.getMethod("main", String[].class);//第一個引數:方法名稱,第二個引數:方法形參的型別,
//3、呼叫main方法
// methodMain.invoke(null, new String[]{"a","b","c"});
//第一個引數,物件型別,因為方法是static靜態的,所以為null可以,第二個引數是String陣列,這里要注意在jdk1.4時是陣列,jdk1.5之后是可變引數
//這里拆的時候將 new String[]{"a","b","c"} 拆成3個物件,,,所以需要將它強轉,
methodMain.invoke(null, (Object)new String[]{"a","b","c"});//方式一
// methodMain.invoke(null, new Object[]{new String[]{"a","b","c"}});//方式二
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:main方法執行了,,,
動態代理實作AOP
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實作程式功能的統一維護的一種技術,
AOP主要功能:日志記錄,性能統計,安全控制,事務處理,例外處理等等wn及擴展
接下來通過代碼來理解一下AOP思想,
代理類:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
/**
* 動態代理技術
*
*/
public class DyProxy {
private Object toProxyObj;
public Object getProxyObject(Object object) {
this.toProxyObj=object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),new InvocationHandler()
{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
long startTime=new Date().getTime();
Object result=method.invoke(toProxyObj,args);
long totalTime=new Date().getTime();
System.out.println("執行時間:"+(totalTime-startTime));
return result;
}
});
}
}
測驗類:
import java.util.Date;
public class TestAOP {
public static void main(String[] args) {
// TODO Auto-generated method stub
//AOP是面向切面編程,測驗性能,統一日志,事務管理
UserService us=(UserService) new DyProxy().getProxyObject(new UserServiceeImp());
us.getUserList();
us.login();
us.logout();
}
}
方法類:
public class UserServiceeImp implements UserService {
@Override
public void login() {
// TODO Auto-generated method stub
System.out.println("login");
}
@Override
public void logout() {
// TODO Auto-generated method stub
System.out.println("logout");
}
@Override
public void getUserList() {
// TODO Auto-generated method stub
System.out.println("getUserList");
}
}
輸出:
getUserList
執行時間:0
login
執行時間:0
logout
執行時間:0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/273220.html
標籤:java
下一篇:java簡易小游戲
