Java使用反射生成JDK代理示例
本文實例講述了Java使用反射生成JDK代理。分享給大家供大家參考,具體如下:
一 點睛
1 動態(tài)代理
java.lang.reflect包下提供了一個Proxy類和一個InvocationHandler接口,通過使用這個類和接口可以生成JDK動態(tài)代理類或動態(tài)代理對象。
Proxy 提供用于創(chuàng)建動態(tài)代理類和代理對象的靜態(tài)方法,它也是所有動態(tài)代理類的父類。如果我們在程序中為一個或多個接口動態(tài)地生成實現(xiàn)類,就可以使用Proxy來創(chuàng)建的動態(tài)代理類;如果需要為一個或多個接口動態(tài)地創(chuàng)建實例,也可以使用Proxy來創(chuàng)建動態(tài)代理實例。
2 Proxy
Proxy提供了如下兩個方法來創(chuàng)建動態(tài)代理類和動態(tài)代理實例:
static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces):創(chuàng)建一個動態(tài)代理類所對應的Class對象,該代理類將實現(xiàn)interfaces所指定的多個接口。第一個ClassLoader指定生成動態(tài)代理類的類加載器。
static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h):直接創(chuàng)建一個動態(tài)代理對象,該代理對象的實現(xiàn)類實現(xiàn)了interfaces指定的系列接口,執(zhí)行代理對象的每個方法時都會被替換執(zhí)行InvocationHandler對象的invoke方法。
二 實戰(zhàn)
1 代碼
import java.lang.reflect.*;
interface Person
{
void walk();
void sayHello(String name);
}
class MyInvokationHandler implements InvocationHandler
{
/*
執(zhí)行動態(tài)代理對象的所有方法時,都會被替換成執(zhí)行如下的invoke方法
其中:
proxy:代表動態(tài)代理對象
method:代表正在執(zhí)行的方法
args:代表調(diào)用目標方法時傳入的實參。
*/
public Object invoke(Object proxy, Method method, Object[] args)
{
System.out.println("----正在執(zhí)行的方法:" + method);
if (args != null)
{
System.out.println("下面是執(zhí)行該方法時傳入的實參為:");
for (Object val : args)
{
System.out.println(val);
}
}
else
{
System.out.println("調(diào)用該方法沒有實參!");
}
return null;
}
}
public class ProxyTest
{
public static void main(String[] args)
throws Exception
{
// 創(chuàng)建一個InvocationHandler對象
InvocationHandler handler = new MyInvokationHandler();
// 使用指定的InvocationHandler來生成一個動態(tài)代理對象
Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader()
, new Class[]{Person.class}, handler);
// 調(diào)用動態(tài)代理對象的walk()和sayHello()方法
p.walk();
p.sayHello("孫悟空");
}
}
2 運行
E:\Java\瘋狂java講義\codes\18\18.5>java ProxyTest
----正在執(zhí)行的方法:public abstract void Person.walk()
調(diào)用該方法沒有實參!
----正在執(zhí)行的方法:public abstract void Person.sayHello(java.lang.String)
下面是執(zhí)行該方法時傳入的實參為:
孫悟空
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
關(guān)于spring中bean注冊的優(yōu)先級分析
Spring框架中,Bean的定義方式主要有三種:XML定義、注解掃描和配置類中的@Bean注解,在Bean注冊過程中,XML定義的GenericBeanDefinition優(yōu)先級最高2024-09-09
spring boot整合mybatis+mybatis-plus的示例代碼
這篇文章主要介紹了spring boot整合mybatis+mybatis-plus的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Freemaker Replace函數(shù)的正則表達式運用
這篇文章主要介紹了Freemaker Replace函數(shù)的正則表達式運用 的相關(guān)資料,需要的朋友可以參考下2015-12-12

