// Java中的动态代理: 1 被代理对象; 2 动态代理, 将被代理对象传入到动态代理类中, 生成动态代理对象
// 利用Proxy类中的newProxyInstance方法生成动态代理, 该方法有三个参数: a 被代理对象的类加载器;
// b 被代理对象所有实现的接口; c InvocationHandler接口
// 该接口只有一个回调方法: invoke, 附带三个参数: a 被代理的对象(因为invoke为回调方法,所以无需用户关心);
// b 被代理对象的方法; c 该方法需要传递的参数 , 在invoke方法内部,可以实现需要的逻辑,返回利用反射生成的对象(method.invoke);
// InvocationHandler接口可采用内部类实现,或将整个动态代理实现InvocationHandler接口,再传入this
// 这类似于Swing中的JFrame,实现监听器接口的操作。 3 利用动态代理生成被代理对象生成的动态代理对象, 然后直接调用欲调用的方法即可
import java.lang.reflect.*;
class DynamicProxy
{
private Object object; // 被代理的对象
public DynamicProxy(Object object){this.object = object;}
public Object getProxy()
{
Class objClass = object.getClass();
return Proxy.newProxyInstance(objClass.getClassLoader(), objClass.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object objAfterInvoked;
System.out.println("msg before dynamic proxy invoked");
objAfterInvoked = method.invoke(DynamicProxy.this.object, args);
System.out.println("msg after dynamic proxy invoked");
return objAfterInvoked;
}
});
}
}
interface Subject // 被代理对象的接口
{
void fn1();
void fn2();
}
class Subject1 implements Subject // 具体的被代理对象
{
public void fn1(){System.out.println("fn1");}
public void fn2(){System.out.println("fn2");}
}
public class Main4
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
DynamicProxy proxy = new DynamicProxy(new Subject1()); // 将被代理的对象传递进去
Subject sub = (Subject)proxy.getProxy(); // 生成动态代理类
sub.fn1(); // 被代理包装后的方法,加了一些其他的业务逻辑
sub.fn2();
}
}
// 利用Proxy类中的newProxyInstance方法生成动态代理, 该方法有三个参数: a 被代理对象的类加载器;
// b 被代理对象所有实现的接口; c InvocationHandler接口
// 该接口只有一个回调方法: invoke, 附带三个参数: a 被代理的对象(因为invoke为回调方法,所以无需用户关心);
// b 被代理对象的方法; c 该方法需要传递的参数 , 在invoke方法内部,可以实现需要的逻辑,返回利用反射生成的对象(method.invoke);
// InvocationHandler接口可采用内部类实现,或将整个动态代理实现InvocationHandler接口,再传入this
// 这类似于Swing中的JFrame,实现监听器接口的操作。 3 利用动态代理生成被代理对象生成的动态代理对象, 然后直接调用欲调用的方法即可
import java.lang.reflect.*;
class DynamicProxy
{
private Object object; // 被代理的对象
public DynamicProxy(Object object){this.object = object;}
public Object getProxy()
{
Class objClass = object.getClass();
return Proxy.newProxyInstance(objClass.getClassLoader(), objClass.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object objAfterInvoked;
System.out.println("msg before dynamic proxy invoked");
objAfterInvoked = method.invoke(DynamicProxy.this.object, args);
System.out.println("msg after dynamic proxy invoked");
return objAfterInvoked;
}
});
}
}
interface Subject // 被代理对象的接口
{
void fn1();
void fn2();
}
class Subject1 implements Subject // 具体的被代理对象
{
public void fn1(){System.out.println("fn1");}
public void fn2(){System.out.println("fn2");}
}
public class Main4
{
public static void main(String[] args)
{
// TODO Auto-generated method stub
DynamicProxy proxy = new DynamicProxy(new Subject1()); // 将被代理的对象传递进去
Subject sub = (Subject)proxy.getProxy(); // 生成动态代理类
sub.fn1(); // 被代理包装后的方法,加了一些其他的业务逻辑
sub.fn2();
}
}
本文介绍Java中的动态代理机制,通过示例代码展示了如何使用Proxy类的newProxyInstance方法创建动态代理对象,并通过InvocationHandler接口定义回调逻辑。文章还提供了一个完整的实现案例。
1564

被折叠的 条评论
为什么被折叠?



