- 浏览: 192101 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (321)
- eclipse (4)
- idea (2)
- Html (8)
- Css (14)
- Javascript (8)
- Jquery (6)
- Ajax Json (4)
- Bootstrap (0)
- EasyUI (0)
- Layui (0)
- 数据结构 (0)
- Java (46)
- DesPattern (24)
- Algorithm (2)
- Jdbc (8)
- Jsp servlet (13)
- Struts2 (17)
- Hibernate (11)
- Spring (5)
- S2SH (1)
- SpringMVC (4)
- SpringBoot (11)
- WebService CXF (4)
- Poi (2)
- JFreeChart (0)
- Shiro (6)
- Lucene (5)
- ElasticSearch (0)
- JMS ActiveMQ (3)
- HttpClient (5)
- Activiti (0)
- SpringCloud (11)
- Dubbo (6)
- Docker (0)
- MySQL (27)
- Oracle (18)
- Redis (5)
- Mybatis (11)
- SSM (1)
- CentOS (10)
- Ant (2)
- Maven (4)
- Log4j (7)
- XML (5)
最新评论
1. Java中动态代理模式
2. VectorProxy
3. 动态代理具体实现
实现动态代理必须实现InvocationHandler接口,实现invoke()方法。 生成代理使用Proxy类(代理)的newProxyInstance()方法。
Subject.java public interface Subject{ public void request(); }
RealSubject.java public class RealSubject implements Subject{ public void request(){ System.out.println("From real subject!"); } }
DynamicSubject.java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 该代理类的内部属性是Object类型,实际使用的时候通过该类的构造方法传递进来一个对象此外,该类还实现了invoke方法,该方法中的method.invoke其实就是调用被代理对象的将要执行的方法,方法参数是sub,表示该方法从属于sub,通过动态代理类,我们可以在执行真实对象的方法前后加入自己的一些额外方法。*/ public class DynamicSubject implements InvocationHandler{ private Object sub; public DynamicSubject(Object obj){ this.sub = obj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ System.out.println("before calling: " + method); method.invoke(sub, args); System.out.println(args == null); System.out.println("after calling: " + method); return null; } }
Client.java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Client{ public static void main(String[] args){ RealSubject realSubject = new RealSubject(); InvocationHandler handler = new DynamicSubject(realSubject); Class<?> classType = handler.getClass(); // 下面的代码一次性生成代理 Subject subject = (Subject) Proxy.newProxyInstance(classType .getClassLoader(), realSubject.getClass().getInterfaces(),handler); subject.request(); System.out.println(subject.getClass()); } } 运行结果: before calling: public abstract void org09.Subject2.request() From real subject2! true after calling: public abstract void org09.Subject2.request() class $Proxy0
2. VectorProxy
VectorProxy.java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.List; import java.util.Vector; public class VectorProxy implements InvocationHandler{ private Object proxyObj; public VectorProxy(Object obj){ this.proxyObj = obj; } public static Object factory(Object obj){ Class<?> classType = obj.getClass(); return Proxy.newProxyInstance(classType.getClassLoader(), classType.getInterfaces(), new VectorProxy(obj)); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ System.out.println("before calling: " + method); if(null != args){ for(Object obj : args){ System.out.println(obj); } } Object object = method.invoke(proxyObj, args); System.out.println("after calling: " + method); return object; } public static void main(String[] args) { List v = (List)factory(new Vector()); System.out.println(v.getClass().getName()); System.out.println("---------------1"); v.add("New"); System.out.println("---------------2"); v.add("York"); System.out.println("---------------3"); System.out.println(v); System.out.println("---------------4"); v.remove(0); System.out.println("---------------5"); System.out.println(v); } } 运行结果: $Proxy0 ---------------1 before calling: public abstract boolean java.util.List.add(java.lang.Object) New after calling: public abstract boolean java.util.List.add(java.lang.Object) ---------------2 before calling: public abstract boolean java.util.List.add(java.lang.Object) York after calling: public abstract boolean java.util.List.add(java.lang.Object) ---------------3 before calling: public java.lang.String java.lang.Object.toString() after calling: public java.lang.String java.lang.Object.toString() [New, York] ---------------4 before calling: public abstract java.lang.Object java.util.List.remove(int) 0 after calling: public abstract java.lang.Object java.util.List.remove(int) ---------------5 before calling: public java.lang.String java.lang.Object.toString() after calling: public java.lang.String java.lang.Object.toString() [York]
3. 动态代理具体实现
Foo.java public interface Foo{ void doAction(); }
FooImpl.java public class FooImpl implements Foo{ public void doAction(){ System.out.println("in FooImpl doAction!"); } }
FooImpl2.java public class FooImpl2 implements Foo{ public void doAction(){ System.out.println("in FooImpl2 doAction!"); } }
CommonInvocationHandler.java import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class CommonInvocationHandler implements InvocationHandler{ private Object target; public CommonInvocationHandler(Object target){ this.target = target; } public CommonInvocationHandler(){ } public void setTarget(Object target){ this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ return method.invoke(target, args); } }
Demo.java import java.lang.reflect.Proxy; public class Demo{ public static void main(String[] args) { CommonInvocationHandler handler = new CommonInvocationHandler(); Foo f = null; handler.setTarget(new FooImpl()); f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler); f.doAction(); System.out.println("-------------------"); handler.setTarget(new FooImpl2()); f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler); f.doAction(); } } 运行结果: in FooImpl doAction! --------- in FooImpl2 doAction!
发表评论
-
Java中获取IP地址、子网掩码、网关地址
2019-06-26 10:53 01. Java中获取IP地址、子网掩码、网关地址、ping连通 ... -
Java中ThreadLocal
2019-04-19 10:44 01. Java中ThreadLocal Java中的Th ... -
Java中原子性锁synchronized、Lock
2019-04-18 15:19 01. synchronized依赖JVM 1) 修饰代码 ... -
Java中原子性Atomic
2019-04-18 14:45 01. Atomic包简介 java.util.concu ... -
开发常用链接
2019-03-26 11:21 0在线工具:http://tool.oschina.net/ ... -
java1234学习目录
2019-03-21 11:08 01-01-01 N01 J2SEv2(41课时) ... -
Java中TCP和UDP
2018-10-25 10:55 3531. 网页内容获取 Url1.java impor ... -
Java中Thread线程
2018-10-25 09:38 3921. 实现线程的两种方式 1. 继承Thread类并重写 ... -
Java中serializable序列化
2018-10-24 14:46 4801. 序列化 transient不会被序列化。 imp ... -
Java中CharSet集
2018-10-24 11:31 5471. CharSet集 import java.nio. ... -
Java中RandomAccessFile类
2018-10-24 11:30 5101. RandomAccessFile类 1. 使用Ra ... -
Java中I/O的字符流InputStreamReader和OutputStreamWriter
2018-10-22 09:43 4461. InputStreamReader和OutputStre ... -
Java中其它输入输出流
2018-10-22 09:08 4771. ByteArrayInputStream流 以ar ... -
Java中I/O的OutputStream流
2018-10-22 08:54 4911. Java中I/O的OutputStream流 1. ... -
Java中I/O的InputStream流
2018-10-22 08:42 4691. Java中I/O的InputStream流 1. ... -
Java中I/O的File类
2018-10-19 13:45 4441. Java中I/O的File类 1. 在window ... -
Java中innerClass内部类
2018-10-18 09:37 4501. Java中innerClass内部类 用AA.BB ... -
Java中adapter适配器
2018-10-18 08:36 5901. Java中adapter适配器 适配器adapte ... -
Java中awt包
2018-10-17 11:26 17181. Java中awt包 AWT事件模型Event 1 ... -
Java中frame对象
2018-10-17 10:56 6841. Java中frame对象 1. Frame对象 ...
相关推荐
- `Proxy`类是Java提供的动态代理的工厂,它可以根据一个接口生成实现了该接口的代理类的对象。这个代理类会动态地生成并实现接口的所有方法。 - `InvocationHandler`接口定义了一个处理方法调用的回调方法`invoke...
在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...
我们先来看Proxy类,它是Java动态代理的核心,它提供了一种机制,能够基于接口生成代理类的实例。 1. **Proxy类的使用**: - 首先,你需要有一个或多个接口,代理对象会实现这些接口。 - 然后,定义一个...
对代理模式与Java动态代理类的理解说明
1:静态代理出现的实际背景,静态代理时如何演化成动态代理 2: 动态代理demo 举例实际应用场景(载入数据库驱动的时候,使用AIDL与系统Servic...4: 动态代理使用到基础理论:Class.forName("xxxx") 得到Class类 。
### Java中动态代理的核心知识点详解 #### 一、动态代理概览 动态代理是Java反射机制的一个重要应用,主要用于在不修改目标对象源代码的情况下,为一个对象提供一个代理对象,这个代理对象能够控制对目标对象的...
动态代理及其生成的代理类,可以反编译查看其类的结构。
Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...
通过这个简单的Java动态代理demo,你可以了解到如何在实际项目中利用动态代理进行功能扩展,同时避免了为每个接口编写单独的代理类。这种技术可以极大地提高代码的可复用性和可维护性,是Java开发中一个强大的工具。
- **代码复用**:通过动态代理,可以编写一次通用的逻辑(如日志记录),然后在多个类中复用。 - **易测试**:代理类可以用于模拟复杂的依赖关系,简化单元测试。 - **扩展性**:动态代理允许在不修改原有代码的...
### Java中的动态代理知识点解析 #### 一、动态代理概念 在Java中,动态代理是一种设计模式,它允许我们创建一个对象来代表另一个对象。这种模式通常用于在不修改目标对象的情况下,为对象添加额外的功能或者行为...
Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已存在的接口创建代理类,以便在调用真实目标对象的方法时添加额外的功能或行为。在这个实例中,我们将深入探讨Java动态代理的核心概念,...
在静态代理中,我们通过编写额外的代理类来实现这一目标,但在动态代理中,代理类是在运行时生成的,无需预先编写代码。 Java JDK提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,...
- **动态语言支持**:例如使用`java.lang.reflect.Proxy`类来创建动态代理类。 - **自定义代码生成**:通过编写代码来手动生成代理类的字节码。 ##### 2.2 动态代理的概念 动态代理允许我们为一个接口创建一个代理...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...
总结来说,Java的静态代理适用于代理类较少且代理逻辑相对固定的情况,而动态代理则在代理类数量不确定或者代理逻辑可能变化时更为合适。两者都可以实现为原始对象添加附加功能,但动态代理在灵活性和代码维护方面...
不过,Cglib生成代理类的速度比JDK慢,且内存占用稍高。 总结来说,Java动态代理为开发者提供了灵活的代码扩展机制,可以根据实际需求选择适合的实现方式。JDK动态代理适用于接口丰富的场景,而Cglib更适合对性能有...
代理模式的核心思想是通过代理类作为委托类的替代品,控制对委托类的访问,同时可以在代理类中添加额外的逻辑。在Java中,代理类和委托类通常实现相同的一组接口,这样代理类就可以代替委托类被客户端调用,而客户端...