`

lang.reflect ->java.lang.reflect.Proxy

阅读更多
java 反射的另外一个主题是动态代理。
关于代理的概念,如果不是太理解,可以先查询参考下设计模式中的代理。

代理的简单概念:

抽象主题:一个接口
真实实现主题:真实实现主题的类
代理实现主题:首先实现和真实主题一样的抽象主题接口,在其中可以调用真实主题的方法。一般代理实现主题都会有一个真实主题的组合成员。

动态代理的概念:
可以动态的根据真实主题和抽象主题 生成代理实现主题,因为可以动态不特定的生成,故曰:动态代理。

java 中的代理实现:
jvm通过动态 解析字节码的形式,动态生成代理主题。

jdk提供的支持类:
1、java.lang.reflect.InvocationHandler 调用接口
   是代理实例调用处理程序 实现的接口。每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法

此接口的唯一方法:
Object invoke(Object proxy, //代理对象(在其上调用方法的代理实例)
              Method method,// 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
              Object[] args) //真实主题传递给method的参数
              throws Throwable


2、java.lang.reflect.Proxy 代理工厂类(以下引用JDK描述)
主要方法介绍:
1、public static InvocationHandler getInvocationHandler(Object proxy)   返回指定代理实例的调用处理程序。
2、public static boolean isProxyClass(Class<?> cl)
当且仅当指定的类通过 getProxyClass 方法或 newProxyInstance 方法动态生成为代理类时,返回 true。
3、public static Object newProxyInstance(ClassLoader loader, //定义代理类的类加载器

                                      Class<?>[] interfaces, //代理类要实现的接口列表

                                      InvocationHandler h)指派方法调用的调用处理程序
                               throws IllegalArgumentException
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

下面举例说明动态代理:
1、抽象主题
package com.horizon.reflect.proxy;

/**
 * 抽象主题
 * @author create by <a href="xinchunwang@aliyun.com">新春.王</a> <br>
 * date :Apr 20, 2013 6:10:10 PM
 */
public interface ILogin {
	public String login(String username, String password);
}



2、真实主题
package com.horizon.reflect.proxy;

/**
 * 真实实现主题
 * @author create by <a href="xinchunwang@aliyun.com">新春.王</a> <br>
 * date :Apr 20, 2013 6:10:48 PM
 */
public class UserLogin implements ILogin {

	@Override
	public String login(String username, String password) {
		// TODO Auto-generated method stub
		return "success";
	}

}


3、调用处理程序
package com.horizon.reflect.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 调用处理程序
 * @author create by <a href="xinchunwang@aliyun.com">新春.王</a> <br>
 * date :Apr 20, 2013 6:23:38 PM
 */
public class LoginInvocationHandler implements InvocationHandler {
    private ILogin login;
	public LoginInvocationHandler(ILogin login){
		this.login = login;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object obj= null;
		System.out.println("before ->method.invoke");
		System.out.println(Arrays.toString(args));
		System.out.println(method);
		obj = method.invoke(login, args);
		System.out.println("end ->method.invoke");
		return obj;
	}

}



4、测试代码
package com.horizon.reflect.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * 动态代理测试
 * 
 * @author create by <a href="xinchunwang@aliyun.com">新春.王</a> <br>
 *         date :Apr 20, 2013 6:11:30 PM
 */
public class LoginTest {
	public static void main(String[] args) {
		//Proxy.getProxyClass(LoginTest.class.getClassLoader(), ILogin.class);
		InvocationHandler h = new LoginInvocationHandler(new UserLogin());
		ILogin obj = (ILogin)Proxy.newProxyInstance(LoginTest.class.getClassLoader(), new Class[]{ILogin.class}, h);
		System.out.println(obj.login("wangxinchun", "123456"));
		System.out.println(obj);
	}
}


输出:

before ->method.invoke
[wangxinchun, 123456]
public abstract java.lang.String com.horizon.reflect.proxy.ILogin.login(java.lang.String,java.lang.String)
end ->method.invoke
success
before ->method.invoke
null
public java.lang.String java.lang.Object.toString()
end ->method.invoke
com.horizon.reflect.proxy.UserLogin@19b49e6
分享到:
评论

相关推荐

    java.lang.reflect.Proxy 学习资料 讲解 例子 源码

    java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码 java.lang.reflect.Proxy 学习资料 讲解 例子 源码

    Java.lang.reflect 包下常用的类及方法简介

    在Java编程语言中,`java.lang.reflect`包是核心库的一部分,它提供了运行时访问类、接口、字段和方法的能力。这个包对于理解和操作对象的动态特性至关重要,尤其是在实现反射机制时。反射允许我们在程序运行期间...

    dt.zip_spring_www.dynamic-proxy.c

    在Spring中,它主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了当代理对象的方法被调用时应如何处理的逻辑。...

    java反射(reflect)

    1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...

    java 请求的方法不存在(NoSuchMethodException)

    3. **Java动态代理**:基于`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,实现对目标对象的代理,用于拦截方法调用。 综上所述,`NoSuchMethodException`是Java编程中需要关注的一个重要异常...

    java reflect and dynamic proxy .Java反射和动态代理

    主要由java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler接口组成。 1. **Proxy类**:Proxy类的newProxyInstance()方法用于创建动态代理对象,它需要一个ClassLoader、一个接口数组和一个...

    【Java基础笔记】反射.docx

    - 生成动态代理:通过`java.lang.reflect.Proxy`类,可以创建动态代理,实现代理模式。 3. **相关包和类** - `java.lang.Class`:表示运行时的类信息,通过类名获取`Class`对象的方法有`forName()`、`getClass()`...

    670.668.JAVA基础教程_动态代理与Java8新特性-Lambda表达式语法的使用(670).rar

    动态代理主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供支持。代理类通过`Proxy.newProxyInstance()`方法创建,而实际业务逻辑则由实现`InvocationHandler`接口的自定义处理器...

    dynamic-proxy-demo.zip

    Java提供了java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理代理对象方法调用的逻辑。这种方式下,我们无需为每个...

    JDK-proxy-mode-spring-source-code-.zip_spring code

    JDK代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。下面将详细解析这些知识点。 首先,`InvocationHandler`接口是JDK代理的核心,它定义了一个方法`invoke(Object proxy,...

    用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统

    7. // 如果不用此包,在启动时抛 出:nested exception is java.lang.NoClassDefFoundError: org/aspectj /weaver /reflect/ReflectionWorld$ReflectionWorldException 8. aspectjweaver.jar 9. 10. //如果不用此...

    java-用Java动态代理实现AOP.pdf

    Java动态代理机制要求被代理的类必须实现至少一个接口,因为Java动态代理是通过JDK的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。Proxy类用于生成代理对象,而InvocationHandler...

    proxy.rar java三种代理模式源码

    在Java中,我们可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,`InvocationHandler`接口定义了代理对象方法调用的处理逻辑。在"DynamicProxy...

    java的类反射

    4. 动态代理:Java的`java.lang.reflect.Proxy`类可以创建动态代理,用于在方法调用前后添加自定义逻辑,比如AOP(面向切面编程)。 5. 框架开发:Spring框架的依赖注入、Hibernate的数据持久化等都大量使用反射技术...

    Java动态代理自建注解

    Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了实现动态代理的基础设施。`InvocationHandler`接口定义了一个`invoke`方法,它会在代理对象调用原对象的方法时被触发。我们...

    Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory详细教程

    import static java.lang.reflect.Proxy.newProxyInstance; import static org.apache.ibatis.reflection.ExceptionUtil.unwrapThrowable; import static org.mybatis.spring.SqlSessionUtils.closeSqlSession; ...

    668.666.JAVA基础教程_动态代理与Java8新特性-Lambda表达式使用举例(668).rar

    Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。当我们创建一个代理对象时,需要提供一个InvocationHandler实例,该实例会在代理对象的方法被调用时进行...

    反射和动态代理(reflect and proxy)---含源码

    在Java中,有两种实现动态代理的方式:`java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口。 Proxy类是生成代理对象的工厂,而InvocationHandler接口定义了处理代理对象方法调用的逻辑。...

    669.667.JAVA基础教程_动态代理与Java8新特性-Lambda表达式语法的使用(669).rar

    在Java中,可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。Proxy类用于创建代理实例,而InvocationHandler接口定义了处理方法调用的逻辑。 然后,我们转向Java 8...

    Java 动态代理.md

    JDK 动态代理主要依赖于 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口。使用 JDK 动态代理时,需要实现 `InvocationHandler` 接口,并通过 `Proxy.newProxyInstance()` 方法创建代理...

Global site tag (gtag.js) - Google Analytics