package com.DynamicProxy3;
/**
* 動態代理: 抽象角色(公共接口)
*
* @author DW
*
*/
public interface DoSomething
{
public void working(String work);
}
package com.DynamicProxy3;
/**
* 動態代理: 真實角色
*
* @author DW
*
*/
public class Man implements DoSomething
{
private String name;
public Man(String name)
{
this.name = name;
}
@Override
public void working(String work)
{
System.out.println(this.name + "在" + work);
}
}
package com.DynamicProxy3;
/**
* 動態代理: 真實角色
*
* @author DW
*
*/
public class Woman implements DoSomething
{
private String name;
public Woman(String name)
{
this.name = name;
}
@Override
public void working(String work)
{
System.out.println(this.name + "在" + work);
}
}
package com.DynamicProxy3;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 動態代理: 代理角色
*
* @author DW
*
*/
public class People implements InvocationHandler
{
private Object object;
public People(Object object)
{
this.object = object;
}
/**
* 動態接受不同的真實角色對象
* @param object
*/
public void setObject(Object object)
{
this.object = object;
}
public static Object factory(Object object)
{
InvocationHandler handler = new People(object);
// 動態生成一個代理
return Proxy.newProxyInstance(object.getClass().getClassLoader(), // 真實對象的類加載器
object.getClass().getInterfaces(), // 真實對象實現的所有接口(數組)
handler // 代理對象,
);
}
/**
* 代理角色類實現了InvocationHandler接口的invoke方法, 當factory方法每次調用后, 都動態生成一個代理實例,
* 當該代理實例引用在外部調用working()方法時, 實際都是在調用本方法; 並通過java底層傳參利用反射機制, 將該代
* 理角色接收的真實角色的working方法通過參數2傳遞進來, working方法的參數則通過參數3傳遞進來...
*
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
// 實際形態:handler引用指向的代理角色對象接受的真實用戶的working方法
return method.invoke(this.object, args);
}
}
package com.DynamicProxy3;
/**
* 動態代理: 測試
*
* @author DW
*
*/
public class DynamicProxyTest
{
public static void main(String[] args)
{
DoSomething doSomething = (DoSomething)People.factory(new Man("張三"));
doSomething.working("狩獵"); // 張三在狩獵
doSomething = (DoSomething)People.factory(new Man("李四"));
doSomething.working("劈柴"); // 李四在劈柴
doSomething = (DoSomething)People.factory(new Woman("翠花"));
doSomething.working("做酸菜"); // 翠花在做酸菜
}
}