静态代理
一、代理类
package com.study.proxy
interface StarCompany {
fun singingMusic(str: String)
}
package com.study.proxy
class StarCompanyProxy(private val starCompany: StarCompany = LiuDeHua()) : StarCompany {
override fun singingMusic(str: String) {
starCompany.singingMusic(str)
}
}
二、被代理类
package com.study.proxy
class LiuDeHua : StarCompany {
override fun singingMusic(str: String) {
println("我是刘德华")
println("刘德华唱::$str")
}
}
package com.study.proxy
class ZhangXueYou : StarCompany {
override fun singingMusic(str: String) {
println("我是张学友")
println("张学友唱::$str")
}
}
三、主程序调用
package com.study.proxy
fun main(args: Array<String>) {
var starCompanyProxy1 = StarCompanyProxy()
starCompanyProxy1.singingMusic("中国话")
var startCompanyProxy2 = StarCompanyProxy(ZhangXueYou())
startCompanyProxy2.singingMusic("东方红")
}
四、运行结果
动态代理
一、InvocationHandler的实现类
package com.study.proxy.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DefineInvocationHandler implements InvocationHandler {
private StarCompany starCompany;
public DefineInvocationHandler(StarCompany starCompany) {
this.starCompany = starCompany;
}
public void before() {
System.out.println("方法执行前...");
}
public void after() {
System.out.println("方法执行后...");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object returnObj = method.invoke(starCompany, args);
after();
return returnObj;
}
}
二、主程序调用
package com.study.proxy.dynamic;
import java.lang.reflect.Proxy;
public class MainClient {
public static void main(String[] args) {
LiuDeHua liuDeHua = new LiuDeHua();
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
StarCompany proxyInstance = (StarCompany) Proxy.newProxyInstance(liuDeHua.getClass().getClassLoader(),
liuDeHua.getClass().getInterfaces(), new DefineInvocationHandler(liuDeHua));
proxyInstance.singingMusic("东方红");
}
}
三、生成在内存中的代理类
package com.sun.proxy;
import com.study.proxy.dynamic.StarCompany;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
public final class $Proxy0 extends Proxy implements StarCompany {
private static Method m1;
private static Method m2;
private static Method m3;
private static Method m0;
public $Proxy0(InvocationHandler var1) throws {
super(var1);
}
public final boolean equals(Object var1) throws {
try {
return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final String toString() throws {
try {
return (String)super.h.invoke(this, m2, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final void singingMusic(String var1) throws {
try {
super.h.invoke(this, m3, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final int hashCode() throws {
try {
return (Integer)super.h.invoke(this, m0, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
m2 = Class.forName("java.lang.Object").getMethod("toString");
m3 = Class.forName("com.study.proxy.dynamic.StarCompany").getMethod("singingMusic", Class.forName("java.lang.String"));
m0 = Class.forName("java.lang.Object").getMethod("hashCode");
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}