Java注解是指Java中用來修飾類、方法、變量、參數(shù)等聲明語句的標(biāo)記,在運(yùn)行時(shí)可供程序讀取,使用這些注解可以更加方便地進(jìn)行代碼的編寫和調(diào)試。注解是Java語言新引進(jìn)的特性,也是現(xiàn)代編程語言重要的一種語法結(jié)構(gòu)。
//示例代碼 @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value() default ""; }
上述代碼示例中,我們定義了一個(gè)用于修飾類的自定義注解@MyAnnotation
,其作用是為這個(gè)類添加一個(gè)value
屬性,而這個(gè)屬性的默認(rèn)取值為空字符串""
。同時(shí),這個(gè)注解只有在運(yùn)行時(shí)被程序讀取才能夠發(fā)揮作用。
動(dòng)態(tài)代理是指為其他對象提供一種代理以控制這個(gè)對象訪問的方式,從而達(dá)到對這個(gè)對象進(jìn)行管理的目的。在Java中,動(dòng)態(tài)代理是指在程序運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建一個(gè)代理類。代理類在內(nèi)部封裝被代理對象,通過代理類來訪問被代理對象,使得代理類可以在運(yùn)行時(shí)為被代理對象添加一些新的功能和行為。
//示例代碼 public interface Hello { void sayHello(); } public class HelloImpl implements Hello { public void sayHello() { System.out.println("Hello"); } } public class DynamicProxy implements InvocationHandler{ private Object target; public Object bind(Object obj){ this.target = obj; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(target, args); System.out.println("Method: " + method.getName() + ", successfully invoked!"); return result; } } public class Main { public static void main(String[] args) { Hello hello = new HelloImpl(); DynamicProxy dynamicProxy = new DynamicProxy(); Hello proxyHello = (Hello) dynamicProxy.bind(hello); proxyHello.sayHello(); } }
上述代碼示例中,我們定義了一個(gè)接口Hello
和它的一個(gè)實(shí)現(xiàn)類HelloImpl
。然后,我們編寫了一個(gè)代理類DynamicProxy
,這個(gè)代理類實(shí)現(xiàn)了InvocationHandler
接口,用于將要被代理的類放入代理類中去。最后,在Main
函數(shù)中,我們通過創(chuàng)建代理類的實(shí)例化對象,給原有類即HelloImpl
添加了新的功能,即在原有方法調(diào)用前打印一條信息,在原有方法執(zhí)行成功以后再打印一條信息,實(shí)現(xiàn)了為原有類添加一些新的功能和行為的目的。