package com.it.dproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//接口
interface Shoes{
void Porduct();
String getName();
}
//被代理类
class ShoesImpl implements Shoes{
private String shoesName;
public ShoesImpl(String shoesName){
this.shoesName = shoesName;
}
@Override
public void Porduct() {
System.out.println("生产" + shoesName + "鞋子");
}
@Override
public String getName() {
return shoesName;
}
}
class SunTest{
public void Star(){
System.out.println("====================通用方法一====================");
}
public void Star2(){
System.out.println("====================通用方法二====================");
}
}
//代理类
class ShoesFactory{
//定义一个方法,返回一个代理类对象给其他人调用被代理类的方法
public static Object getProxyInstance(Object obj){
MyinvocationHandle myinvocationHandle = new MyinvocationHandle(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), myinvocationHandle);
}
}
//实现一个invocationHandle接口
class MyinvocationHandle implements InvocationHandler{
private Object object;
public MyinvocationHandle(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SunTest util = new SunTest();
util.Star();
Object invoke = method.invoke(object, args);
util.Star2();
return invoke;
}
}
public class ShoesTest {
public static void main(String[] args) {
ShoesImpl shoes = new ShoesImpl("耐克");
Shoes proxyInstance = (Shoes) ShoesFactory.getProxyInstance(shoes);
String name = proxyInstance.getName();
System.out.println(name);
proxyInstance.Porduct();
System.out.println("=============================");
Shoes shoes2 = new ShoesImpl("Adidas");
Shoes proxyInstance2 = (Shoes) ShoesFactory.getProxyInstance(shoes2);
String name2 = proxyInstance2.getName();
System.out.println(name2);
proxyInstance2.Porduct();
}
}
动态代理示例
最新推荐文章于 2024-07-22 22:58:19 发布