`
liyonghui160com
  • 浏览: 774528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java.lang.reflect.Proxy

    博客分类:
  • java
阅读更多

 

1.简介

 

Proxy 提供用于创建动态代理类和实例的静态方法

(1)动态代理类的属性

  • 代理类是公共的、最终的,而不是抽象的
  • 未指定代理类的非限定名称。但是,以字符串 "$Proxy" 开头的类名空间应该为代理类保留
  • 代理类扩展 java.lang.reflect.Proxy
  • 代理类会按同一顺序准确地实现其创建时指定的接口
  • 如果代理类实现了非公共接口,那么它将在与该接口相同的包中定义。否则,代理类的包也是未指定的。注意,包密封将不阻止代理类在运行时在特定包中的成功定义,也不会阻止相同类加载器和带有特定签名的包所定义的类
  • 由于代理类将实现所有在其创建时指定的接口,所以对其 Class 对象调用 getInterfaces 将返回一个包含相同接口列表的数组(按其创建时指定的顺序),对其 Class 对象调用 getMethods 将返回一个包括这些接口中所有方法的 Method 对象的数组,并且调用 getMethod 将会在代理接口中找到期望的一些方法
  • 如果 Proxy.isProxyClass 方法传递代理类(由 Proxy.getProxyClass 返回的类,或由 Proxy.newProxyInstance 返回的对象的类),则该方法返回 true,否则返回 false
  • 代理类的 java.security.ProtectionDomain 与由引导类加载器(如 java.lang.Object)加载的系统类相同,原因是代理类的代码由受信任的系统代码生成。此保护域通常被授予 java.security.AllPermission
  • 每个代理类都有一个可以带一个参数(接口 InvocationHandler 的实现)的公共构造方法,用于设置代理实例的调用处理程序。并非必须使用反射 API 才能访问公共构造方法,通过调用 Proxy.newInstance 方法(将调用 Proxy.getProxyClass 的操作和调用带有调用处理程序的构造方法结合在一起)也可以创建代理实例

(2)冲突处理

 

  • 不同的接口有相同的方法声明:第一个实现接口的Method对象将被传递
  • 接口中有方法声明与java.lang.ObjecthashCodeequalstoString 方法相同:java.lang.Object 的Method对象将被传递,换句话说,java.lang.Object 公共的非最终方法理论上在所有代理接口之前

 

3.实例

 

 

(1)TargetInterface

 

package com.siyuan.designmodel.aop;

public interface TargetInterface {
	void doSomething();
	String toString();
}

 

 

(2)TargetInterface1

 

package com.siyuan.designmodel.aop;

public interface TargetInterface1 {

	void doSomething();
	
}

 

(3)Target

package com.siyuan.designmodel.aop;

public class Target implements TargetInterface, TargetInterface1 {

	public void doSomething() {
		System.out.println("do something...");
	}
	
	public String toString() {
		return "Target.toString()";
	}
	
}

 

(4)MyHandler

 

package com.siyuan.designmodel.aop;

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

public class MyHandler implements InvocationHandler {
	private Interceptor interceptor = new Interceptor();
	private Object target;
	
	public void setObj(Object target) {
		this.target = target;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		interceptor.beforeDoSomething();
		System.out.println(method);
		method.invoke(target, args);
		interceptor.afterDoSomething();
		return result;
	}

}

 

(5)Interceptor

 

package com.siyuan.designmodel.aop;

public class Interceptor {
	public void beforeDoSomething(){
		System.out.println("beforeDoSomething...");
	}
	
	public void afterDoSomething(){
		System.out.println("afterDoSomething...");
	}
}

 

(6)MyProxy

 

package com.siyuan.designmodel.aop;

import java.lang.reflect.Proxy;

public class MyProxy {
	private MyHandler myHandler;
	
	public void setMyHandler(MyHandler myHandler) {
		this.myHandler = myHandler;
	}

	public Object getProxy(Object target){
		myHandler.setObj(target);
		return Proxy.newProxyInstance(MyProxy.class.getClassLoader(), 
									target.getClass().getInterfaces(), 
									myHandler);
	}
}

 

(7)AOPTeset

package com.siyuan.designmodel.aop;

public class AOPTeset {

	/**
	 * AOP模式优势:把一些可重用的代码通过切面实现,例如:Spring的事务管理
	 */
	public static void main(String[] args) {
		
		Target target = new Target();
		MyHandler myHandler = new MyHandler();
		MyProxy myProxy = new MyProxy();
		myProxy.setMyHandler(myHandler);
//		TargetInterface proxy = (TargetInterface) myProxy.getProxy(target);
		TargetInterface1 proxy = (TargetInterface1) myProxy.getProxy(target);
		proxy.doSomething();
		System.out.println(proxy.toString());
		
	}

}

 

4.运行结果

 

beforeDoSomething...
public abstract void com.siyuan.designmodel.aop.TargetInterface.doSomething()
do something...
afterDoSomething...
beforeDoSomething...
public java.lang.String java.lang.Object.toString()
afterDoSomething...
null

 

 

分享到:
评论

相关推荐

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

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

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

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

    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反射(reflect)

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

    java的类反射

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

    Java动态代理自建注解

    return (T) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new CheckParamsInvocationHandler(target) ); } } ``` 现在,我们可以在任何实现了接口的类...

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

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

    【Java基础笔记】反射.docx

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

    Java1.6API中文版

    14. **JNI本地接口**:`java.lang.reflect`包中的`java.lang.reflect.InvocationHandler`和`java.lang.reflect.Proxy`,允许Java代码调用本地(C/C++)代码。 通过阅读Java 1.6 API中文版的CHM文件,开发者可以深入...

    深入理解Java Proxy机制.doc

    在Java中,`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是实现这一功能的核心。 2. **Proxy类**: - `Proxy`类是Java的内置类,它提供了一种创建代理对象的方法。代理对象不仅实现了...

    Java语言的动态属性总结[参考].pdf

    7. **Java.lang.reflect.Proxy**: 支持动态代理,使得我们可以创建一个类的代理对象,该代理对象可以在调用方法时执行额外的操作。这在AOP(面向切面编程)中非常有用。 8. **Java.lang.reflect.InvocationHandler**:...

    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; ...

    java反射机制的应用

    4. **动态代理**:Java的动态代理机制(`java.lang.reflect.Proxy`)允许在运行时创建代理类来拦截方法调用。 5. **测试工具**:如JUnit,通过反射调用私有方法进行测试。 6. **日志和监控**:分析和记录程序运行...

    Java动态代理[动态类Proxy的使用]

    本文将深入探讨Java中的动态代理,特别是基于`java.lang.reflect.Proxy`类的使用。 首先,`java.lang.reflect.Proxy`是Java标准库中用于生成动态代理类的关键类。它允许我们创建一个新的接口实现类,而无需手动编写...

    JAVA的反射机制与动态代理.pdf

    我们需要提供一个实现了`java.lang.reflect.InvocationHandler`接口的类,然后使用`Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`方法创建代理对象。代理对象在调用方法时...

    Java 动态代理.md

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

    java学习资料-反射机制深入理解剖析

    5. 创建动态代理,通过`java.lang.reflect.Proxy`类,可以在运行时生成代理对象来实现特定接口。 在实际开发中,反射机制常用于: - 框架设计:Spring框架中的依赖注入、AOP切面编程等都大量使用了反射。 - 动态...

    java使用动态代理来实现AOP(日志记录)的实例代码共6

    Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个实现了特定接口的代理对象,而InvocationHandler接口则定义了代理对象处理方法调用的...

Global site tag (gtag.js) - Google Analytics