以例子来说明动态代理:
package com.gym;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface A {
public void a(int a);
}
interface B {
public void b(int b);
}
class BImpl implements InvocationHandler {
private A a = new A() {
public void a(int a) {
System.out.println("-----a------" + a);
}
public String toString() {
return "A";
};
};
private B b = new B() {
public void b(int b) {
System.out.println("-----b------" + b);
}
public String toString() {
return "B";
};
};
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (method.getName().equals("a")) {
method.invoke(a, args);
} else if (method.getName().equals("b")) {
method.invoke(b, args);
}
/*if (method.getName().equals("toString")) {
return "*********toString*************";
}*/
System.out.println(proxy instanceof A);
System.out.println(proxy instanceof B);
//System.out.println(proxy); //此处会死循环 (1)
return null;
}
@Override
public String toString() {
return "SSSSSSSSSSSS";
}
}
/**
*
* @author xinchun.wang
*
* Object obj = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
new Class[] { A.class, B.class },new BImpl());
* 注意:
* obj 和 BImpl 实例之间的关系:首先obj 拥有BImpl,
* obj 和 A,B 实例之间的关系:obj 是A也是B,一个动态的代理实现
* 对比(1) (2) obj 的 toString方法 和 proxy 的关系
*/
public class JDKProxy {
public static void main(String[] args) {
Object obj = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
new Class[] { A.class, B.class },new BImpl());
A a = (A) obj;
a.a(1);
System.out.println(a);
B b = (B) obj;
b.b(10);
System.out.println(obj); //(2)
System.out.println(Proxy.getInvocationHandler(obj));
}
}
分享到:
相关推荐
在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...
- Java动态代理基于Java反射API实现,主要涉及到`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`两个类。 - `Proxy`类用于创建一个代理对象,而`InvocationHandler`接口定义了调用处理程序,它...
JDK动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。 ```java // 创建InvocationHandler public class MyInvocationHandler implements InvocationHandler { private ...
总结来说,Java动态代理通过`Proxy`和`InvocationHandler`提供了灵活的代码扩展机制,可以在运行时为对象创建代理,实现在不修改原有代码的基础上添加额外功能。这在处理需要拦截和增强的对象时非常有用,例如日志...
Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...
JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。 InvocationHandler 是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务...
Java中的`InvocationHandler`接口是Java动态代理机制的核心组成部分,主要用在`java.lang.reflect`包下。这个接口提供了一种方法,使得我们可以在运行时创建具有特定行为的代理对象。这种行为通常体现在调用代理对象...
Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类提供了一个静态方法`newProxyInstance()`用于创建动态代理对象,而`InvocationHandler`接口定义了代理...
在Java中,有两种方式实现动态代理:一种是通过Java的标准库`java.lang.reflect.Proxy`,另一种是使用Java的接口`java.lang.reflect.InvocationHandler`。我们先来看Proxy类,它是Java动态代理的核心,它提供了一种...