java 反射 动态代理
**************************
相关类及接口
Proxy
public class Proxy implements java.io.Serializable {
********
构造函数
private Proxy() {
}
protected Proxy(InvocationHandler h) {
Objects.requireNonNull(h);
this.h = h;
}
********
创建代理对象
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) {
private static Object newProxyInstance(Class<?> caller, Constructor<?> cons, InvocationHandler h) {
InvocationHandler
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
//proxy:代理对象
//method:调用的真实方法
//args:调用方法的参数
}
**************************
示例
interface Base1{
void fun();
}
interface Base2{
void fun2();
}
class Sub implements Base1,Base2{
@Override
public void fun() {
System.out.println("接口C:瓜田李下");
}
@Override
public void fun2() {
System.out.println("接口C2:瓜田李下2");
}
}
class CustomProxy implements InvocationHandler{
private Sub sub;
public Object getProxy(Sub sub){
this.sub=sub;
return Proxy.newProxyInstance(sub.getClass().getClassLoader(),
sub.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理对象开始调用被代理对象的方法:"+method.toString());
Object result=method.invoke(this.sub,args);
System.out.println("被代理方法调用结束"+"\n");
return result;
}
}
public class MyTest6 {
public static void main(String[] args){
Sub sub=new Sub();
CustomProxy customProxy=new CustomProxy();
Base1 b1=(Base1)customProxy.getProxy(sub);
b1.fun();
Base2 b2=(Base2) customProxy.getProxy(sub);
b2.fun2();
}
}
*****************
控制台输出
代理对象开始调用被代理对象的方法:public abstract void hello2.Base1.fun()
接口C:瓜田李下
被代理方法调用结束
代理对象开始调用被代理对象的方法:public abstract void hello2.Base2.fun2()
接口C2:瓜田李下2
被代理方法调用结束