`

java-InvocationHandler 动态代理

阅读更多
以例子来说明动态代理:

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));
	}
}
0
1
分享到:
评论

相关推荐

    java-jdk动态代理的实现demo

    在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...

    java事务 - 使用动态代理

    - Java动态代理基于Java反射API实现,主要涉及到`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`两个类。 - `Proxy`类用于创建一个代理对象,而`InvocationHandler`接口定义了调用处理程序,它...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    JDK动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。 ```java // 创建InvocationHandler public class MyInvocationHandler implements InvocationHandler { private ...

    Java动态代理实现 Proxy InvocationHandler

    总结来说,Java动态代理通过`Proxy`和`InvocationHandler`提供了灵活的代码扩展机制,可以在运行时为对象创建代理,实现在不修改原有代码的基础上添加额外功能。这在处理需要拦截和增强的对象时非常有用,例如日志...

    Java 反射-动态代理

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行上发挥着关键作用。本文将深入探讨这两个概念,以及如何在实际开发中利用它们。 首先,我们来理解Java反射(Reflection)。Java反射...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。 InvocationHandler 是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务...

    java InvocationHandler

    Java中的`InvocationHandler`接口是Java动态代理机制的核心组成部分,主要用在`java.lang.reflect`包下。这个接口提供了一种方法,使得我们可以在运行时创建具有特定行为的代理对象。这种行为通常体现在调用代理对象...

    Java中的动态代理

    Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类提供了一个静态方法`newProxyInstance()`用于创建动态代理对象,而`InvocationHandler`接口定义了代理...

    Java实现动态代理

    在Java中,有两种方式实现动态代理:一种是通过Java的标准库`java.lang.reflect.Proxy`,另一种是使用Java的接口`java.lang.reflect.InvocationHandler`。我们先来看Proxy类,它是Java动态代理的核心,它提供了一种...

Global site tag (gtag.js) - Google Analytics