首先建一个接口
public interface Hello {
void say();
void say(int a,int b);
}
//继承类HelloChina
public class HelloChina implements Hello {
public void say() {
// TODO Auto-generated method stub
System.out.println("HelloChina!");
}
@Override
public void say(int a, int b) {
System.out.println("a+b="+(a+b));
}
}
//继承类HelloWord
public class HelloWord implements Hello {
public void say() {
// TODO Auto-generated method stub
System.out.println("HelloWord!");
}
@Override
public void say(int a, int b) {
System.out.println("a+b="+(a+b));
}
}
//包装类HelloWrapper
public class HelloWrapper implements Hello {
private Hello wrapper;
public HelloWrapper(Hello hello) {
// TODO Auto-generated constructor stub
this.wrapper=hello;
}
public void say() {
// TODO Auto-generated method stub
System.out.println("start to say!");
wrapper.say();
System.out.println("end to say!");
}
@Override
public void say(int a, int b) {
System.out.println("start to say!");
wrapper.say(a,b);
System.out.println("end to say!");
}
}
//动态代理类(需要继承自InvocationHandler )
public class HelloHandler implements InvocationHandler {
private Object proxyed;
public HelloHandler() {
// TODO Auto-generated constructor stub
}
public HelloHandler(Object proxyed) {
// TODO Auto-generated constructor stub
this.proxyed=proxyed;
}
@Override
public Object invoke(Object proxy1, Method method, Object[] args)
throws Throwable {
Object result;
System.out.println("start to invoke");
//调用原始对象的方法
result=method.invoke(proxyed, args);//返回调用结果
System.out.println("end to invoke");
return result;
}
}
测试类的部分代码
//代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
//代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,
//代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
//代理类可分为两种。
//l静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
//l动态代理类:在程序运行时,运用反射机制动态创建而成。
//静态代理
Hello world=new HelloWord();
Hello china=new HelloChina();
/*
HelloWrapper wa1=new HelloWrapper(world);
wa1.say();
HelloWrapper wa2=new HelloWrapper(china);
wa2.say();
wa2.say(5,5);
*/
//动态代理调用
//不分步骤
InvocationHandler in=new HelloHandler(world);
InvocationHandler h=new HelloHandler(china);
//Hello proxy1=(Hello)Proxy.newProxyInstance(world.getClass().getClassLoader(), world.getClass().getInterfaces(), in);
//proxy1.say();
//proxy1.say(4,5);
//分步骤
System.out.println("++++++++++++"+Hello.class.getClassLoader());
Class cls=Proxy.getProxyClass(world.getClass().getClassLoader(), world.getClass().getInterfaces());
Class cls1=Proxy.getProxyClass(Collection.class.getClassLoader(), new Class[]{Collection.class});
//Class cls=Proxy.getProxyClass(Hello.class.getClassLoader(), new Class[]{Hello.class});
System.out.println("++++++++++++"+cls.getName());//生成的代理类的名称$Proxy0
//System.out.println("++++++++++++"+cls.get);
Method []m=cls.getMethods();
for(int i=0;i<m.length;i++){
System.out.println("++++++++++++"+m[i].toString());
}
Constructor []co=cls.getConstructors();
for(int i=0;i<co.length;i++){
System.out.println("++++++++++++"+co[i].toString());
}
Class [] cl=cls.getInterfaces();
for(int i=0;i<cl.length;i++){
System.out.println("++++++++++++"+cl[i].toString());
}
System.out.println("++++++++++++测试二++++++++++++++++++++++++++++++");
System.out.println("++++++++++++"+cls1.getName());//生成的代理类的名称$Proxy1
Method []m1=cls1.getMethods();
for(int i=0;i<m1.length;i++){
System.out.println("++++++++++++"+m1[i].toString());
}
Constructor []co1=cls1.getConstructors();
for(int i=0;i<co1.length;i++){
System.out.println("++++++++++++"+co1[i].toString());
}
Class [] cl1=cls1.getInterfaces();
for(int i=0;i<cl1.length;i++){
System.out.println("++++++++++++"+cl1[i].toString());
}
try {
Constructor ct = cls.getConstructor(new Class[]{InvocationHandler.class});
//Constructor ct1 = cls1.getConstructor(new Class[]{InvocationHandler.class});
try {
Hello subject =(Hello) ct.newInstance(new Object[]{in});
//subject.say();
subject.say(5,10);
//subject =(Hello) ct1.newInstance(new Object[]{h});
//subject.say();
//subject.say(8,9);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
测试结果如下:
++++++++++++sun.misc.Launcher$AppClassLoader@19821f
++++++++++++$Proxy0
++++++++++++public final void $Proxy0.say()
++++++++++++public final void $Proxy0.say(int,int)
++++++++++++public final int $Proxy0.hashCode()
++++++++++++public final boolean $Proxy0.equals(java.lang.Object)
++++++++++++public final java.lang.String $Proxy0.toString()
++++++++++++public static boolean java.lang.reflect.Proxy.isProxyClass(java.lang.Class)
++++++++++++public static java.lang.Class java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[]) throws java.lang.IllegalArgumentException
++++++++++++public static java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException
++++++++++++public static java.lang.Object java.lang.reflect.Proxy.newProxyInstance(java.lang.ClassLoader,java.lang.Class[],java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException
++++++++++++public final void java.lang.Object.wait() throws java.lang.InterruptedException
++++++++++++public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
++++++++++++public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
++++++++++++public final native java.lang.Class java.lang.Object.getClass()
++++++++++++public final native void java.lang.Object.notify()
++++++++++++public final native void java.lang.Object.notifyAll()
++++++++++++public $Proxy0(java.lang.reflect.InvocationHandler)
++++++++++++interface proxy.Hello
++++++++++++测试二++++++++++++++++++++++++++++++
++++++++++++$Proxy1
++++++++++++public final boolean $Proxy1.add(java.lang.Object)
++++++++++++public final int $Proxy1.hashCode()
++++++++++++public final void $Proxy1.clear()
++++++++++++public final boolean $Proxy1.equals(java.lang.Object)
++++++++++++public final java.lang.String $Proxy1.toString()
++++++++++++public final boolean $Proxy1.contains(java.lang.Object)
++++++++++++public final boolean $Proxy1.isEmpty()
++++++++++++public final boolean $Proxy1.addAll(java.util.Collection)
++++++++++++public final java.util.Iterator $Proxy1.iterator()
++++++++++++public final int $Proxy1.size()
++++++++++++public final java.lang.Object[] $Proxy1.toArray(java.lang.Object[])
++++++++++++public final java.lang.Object[] $Proxy1.toArray()
++++++++++++public final boolean $Proxy1.remove(java.lang.Object)
++++++++++++public final boolean $Proxy1.containsAll(java.util.Collection)
++++++++++++public final boolean $Proxy1.removeAll(java.util.Collection)
++++++++++++public final boolean $Proxy1.retainAll(java.util.Collection)
++++++++++++public static boolean java.lang.reflect.Proxy.isProxyClass(java.lang.Class)
++++++++++++public static java.lang.Class java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[]) throws java.lang.IllegalArgumentException
++++++++++++public static java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException
++++++++++++public static java.lang.Object java.lang.reflect.Proxy.newProxyInstance(java.lang.ClassLoader,java.lang.Class[],java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException
++++++++++++public final void java.lang.Object.wait() throws java.lang.InterruptedException
++++++++++++public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
++++++++++++public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
++++++++++++public final native java.lang.Class java.lang.Object.getClass()
++++++++++++public final native void java.lang.Object.notify()
++++++++++++public final native void java.lang.Object.notifyAll()
++++++++++++public $Proxy1(java.lang.reflect.InvocationHandler)
++++++++++++interface java.util.Collection
start to invoke
a+b=15
end to invoke
分享到:
相关推荐
Java动态代理是Java提供的一种在运行时创建代理对象的技术,主要由`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口组成。在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心...
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
### Java中的动态代理知识点解析 #### 一、动态代理概念 在Java中,动态代理是一种设计模式,它允许我们创建一个对象来代表另一个对象。这种模式通常用于在不修改目标对象的情况下,为对象添加额外的功能或者行为...
1. **什么是动态代理?** 动态代理是指在程序运行时,根据指定的接口动态创建一个代理类,并且这个代理类可以实现与被代理对象相同的行为。在Java中,动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang....
Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解对象获取、日志、用户鉴权、全局性异常处理、性能监控等领域。...
### Java动态代理知识点详解 #### 一、Java动态代理简介 在Java中,动态代理是一种非常重要的机制,它允许我们在运行时动态地创建一个接口的实现类实例。这种技术广泛应用于AOP(面向切面编程)、RPC(远程过程...
1. **Java动态代理的基本概念** - 动态代理是在程序运行时生成接口的实现类,而无需在编译时就确定。这使得我们可以在运行时决定代理对象的行为。 - Java提供了一个内置的`java.lang.reflect.Proxy`类和`java.lang...
而动态代理则是在运行时动态生成代理类,通常使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理常用于事件处理、事务管理、日志记录等场景,它可以在方法调用前后添加...
Java动态代理是Java编程中的一种重要技术,它允许我们在运行时创建对象的代理,以便在调用实际对象的方法之前和之后执行额外的操作。本资源包专注于CGLIB库,一个强大的代码生成库,用于实现Java动态代理。 CGLIB...
Java反射和动态代理是Java编程中的高级特性,它们在实际开发中有着广泛的应用。反射机制允许我们在运行时检查类、接口、字段和方法的信息,甚至能够动态调用方法和修改对象的状态。动态代理则是在运行时创建一个实现...
Java动态代理是Java语言提供的一种在运行时创建代理对象的技术,它允许我们为已经存在的接口创建代理类,以便在调用真实对象的方法之前或之后添加额外的功能。动态代理主要涉及到两个核心类:`java.lang.reflect....
在Java编程中,动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以代表或增强原始目标类的行为。在这个名为"Java动态代理ReflectProxyDemo"的示例中,我们将深入探讨如何利用Java的反射API和...
Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...
在Java编程中,动态替换代理IP是一个常见的需求,特别是在网络爬虫、自动化测试或需要频繁切换网络环境的应用中。这个话题涉及到Java的反射机制、动态代理以及网络编程的知识点。以下将详细介绍这些内容。 首先,...
### JAVA类加载机制与动态代理 #### 一、类加载机制 ##### 1.1 类加载的时机 类加载机制负责将描述类的数据从`.class`文件加载到内存,并进行必要的校验、转换解析和初始化,使之成为可以被Java虚拟机直接使用的...
`Test.java`应该是测试类,用于验证动态代理功能的正确性。 在`ComputerProxy`中,我们可能会定义一个`InvocationHandler`实例,然后通过`Proxy.newProxyInstance()`创建代理对象。代理对象会替代真实的计算机制造...
JAVA动态代理机制是Java语言中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理对象,这些代理对象可以在调用实际方法之前或之后执行额外的操作,如日志记录、性能监控、事务管理等。这个特性使得我们...
Java反射和动态代理是Java编程中的重要特性,它们允许程序在运行时检查和操作类、接口、对象等的内部结构,以及动态地创建代理对象来处理特定任务。在这篇文章中,我们将深入探讨这两个主题,结合"reflections"这个...
Java动态代理和CGLIB代理是两种常用的在Java中实现面向切面编程(AOP)的技术,它们允许我们在不修改原有代码的情况下,为方法添加额外的功能,如日志记录、性能监控、事务管理等。本篇文章将深入探讨这两种代理机制...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理对象,这些代理对象可以作为原有对象的“代理”,在调用原有方法时添加额外的功能或行为。这一技术在软件开发中广泛应用,特别是在实现设计模式...