`
liyonghui160com
  • 浏览: 762311 次
  • 性别: 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 高级特性.doc

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Collection; import java.util.Vector; public class ProxyTest { public ...

    java静态代理和动态代理详解

    Java中提供了一个java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。代理类在运行时会根据被代理接口自动生成,并且可以通过InvocationHandler接口对方法进行增强。

    Spring框架+SpringAOP动态代理

    Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于代理没有实现接口的类或final类。CGLIB(Code Generation Library)是一个代码生成的类库,可以在运行时动态生成一个目标类的子类,并...

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar

    * 动态代理中的静态方法:java.lang.reflect.Proxy.newProxyInstance (ClassLoader(类加载器),interface(接口),handler(监听处理器)) * * 代码示例:《帮爸爸买菜》 * 1.Father: 被代理类,必须需要实现接口 ...

    c3p0工具包(jdbc)

    chain.doFilter((ServletRequest) Proxy.newProxyInstance(CharFilter.class.getClassLoader(),request.getClass().getInterfaces(), new InvocationHandler(){ public Object invoke(Object proxy, Method ...

    ProxyTest.zip

    Java动静态代理机制简介,尤其是动态代理,结合反射机制,为后续的java hook技术打下基础。动态代理需实现java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy 类的支持。

    基于java的企业级应用开发:JDK动态代理.ppt

    * * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...

    vs没报错leetcode报错-leetcode:leetcode

    vs没报错leetcode报错 leetcode ...java.lang.reflect.Proxy; /* * JDK 动态代理 * */ public class dynamicProxyUsingJDK { public static void main(String[] args) { UserImpl user = new UserImpl();

    java 实现AOP

     JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被...

    cglib-3.3.0.jar

    CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展...CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法。

    cglib-full-2.0.2 jar包

    cglib-full-2.0.2.jarCGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库。...CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法。

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

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

    java8stream源码-coala-binder:代理的通用本体抽象层——一种上下文绑定器,用于跨AOSE/MAS和M&S/ABM重用异构

    java8流源码可乐 代理的通用本体抽象层——一种上下文绑定器,用于跨 AOSE/MAS 和 M&S/ABM 重用异构代理代码 常见的 具有异步回调的函数式风格:和 ...API(使用java.lang.reflect.Proxy和java.beans.Introspector )支

    COS——R.log

    at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397) at org.apache.axis.providers.java.RPCProvider.processMessage...

    proxytoys:有用的Java代理工具集合

    代理工厂和常用用法动机您是否曾经开发过使用java.lang.reflect.Proxy代码并认为: “那个CGLIB库肯定很棒。我希望我可以在不更改代码的情况下同时使用标准代理和CGLIB代理”。 有了ProxyToys,您可以! ProxyToys...

    java业务层框架开发ibatis(java源码)

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql....

    prototypal_aop_engine_android

    这种行为是使用 java.lang.reflect.Proxy 实现的; 代理行为可通过包含 JSON 对象(带有关键“目标”)的文本文件进行配置,它适用于通用 Java 应用程序和 Android 应用程序。 我希望你喜欢它......玩得开心!!! ...

    单元测试中的伪对象

    EasyMock基于java.lang.reflect.Proxy,他可以根据给定的接口创建动态代理类或者对象。但因为使用Proxy使得他有一个天生的缺陷:只能创建基于接口的伪对象。Mocquer是一个类似的工具,但他扩展了EasyMock的功能能够...

    prototypal_aop_engine

    这种行为是通过代理类的运行时生成实现的,不使用 java.lang.reflect.Proxy ; 代理行为可通过包含 JSON 对象(带有关键“目标”)的文本文件进行配置; 我专门为了知识而制作它。 我希望你喜欢它......玩得开心!...

Global site tag (gtag.js) - Google Analytics