完成InvocationHandler对象的内部功能
分析InvocationHandler对象的运行原理
总结分析动态代理类的设计原理与结构
创建动态类的实例对象及调用其方法
package java_5;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
public class Proxy_InvocationHandler_Test {
public static void main(String[] args) throws NoSuchMethodException,
SecurityException, InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
ArrayList<Object> arr = new ArrayList<>();
@SuppressWarnings("unchecked" )
Collection<String> collection =(Collection<String>) getProxy(arr, new Advice() {
private long startTime ;
private long endTime ;
@Override
public void beforeMethod(Object proxy, Method method, Object[] args) {
startTime = System.currentTimeMillis();
System. out.println(method.getName() + "花费了"
+ ( endTime - startTime ) + "时间" );
}
@Override
public void afterMethod(Object proxy, Method method, Object[] args) {
endTime = System.currentTimeMillis();
}
});
// 内部通过调用 invocationhandler的invoke方法来完成调用
collection.add( "qqq");
collection.add( "www");
collection.add( "eee");
System. out.println(collection.size());
}
private static Object getProxy(final Object arr,
final Advice advice) throws NoSuchMethodException,
InstantiationException, IllegalAccessException,
InvocationTargetException {
Class<?> clazz = Proxy.getProxyClass(arr.getClass ().getClassLoader(),
arr. getClass().getInterfaces());
Constructor<?> constructor = clazz
.getConstructor( new Class[] { InvocationHandler.class });
// 第二种方式:Proxy.newProxyInstance(loader, interfaces, h)
@SuppressWarnings("unchecked" )
Object object = constructor
// 要求在构造时传递参数,说明对象肯定维护了一个成员变量,而且要接收成员。为之所用
.newInstance( new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// 业务1,调用传进来的业务对象
advice.beforeMethod(proxy, method, args);
Object o = method.invoke(arr, args);
// 业务2,调用传进来的业务对象
advice.beforeMethod(proxy, method, args);
return o;
}
});
return constructor;
}
}
// 把想要做的业务封装成一个对象
interface Advice {
void beforeMethod(Object proxy, Method method, Object[] args);
void afterMethod(Object proxy, Method method, Object[] args);
}
模拟spring的架构原理:实现类似spring的可配置的AOP框架
#name=java.util.ArrayList
name= java_5_AOP.ProxyFactoryBean
name.advice= java_5_AOP.MyAdvice
name.target= java.util.ArrayList
package java_5_AOP;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;
public class FactoryBean {
private Properties properties ;
public FactoryBean(InputStream ips) throws IOException {
properties = new Properties();
properties .load(ips);
}
public Object getProxy(String name) throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
String objectName = properties .getProperty(name);
Class<?> clazz = Class. forName(objectName);
Object o1 = clazz. newInstance();
if (o1 instanceof ProxyFactoryBean) {
ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
String targetClass = properties .getProperty(name + ".target" );
String adviceClass = properties .getProperty(name + ".advice" );
Object o2 = proxyFactoryBean.getProxy((Advice) Class.forName(adviceClass)
. newInstance(), Class.forName(targetClass).newInstance ());
return o2;
}
return o1;
}
}
class ProxyFactoryBean {
private Advice advice ;
public Advice getAdvice() {
return advice ;
}
public void setAdvice(Advice advice) {
this .advice = advice;
}
public Object getTarget() {
return target ;
}
public void setTarget(Object target) {
this .target = target;
}
private Object target ;
public Object getProxy( final Advice advice, final Object object) {
Object proxy = Proxy.newProxyInstance(object.getClass()
.getClassLoader(), object.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
//把业封装成对象
advice.startMethod(object, method, args);
Object o = method.invoke(object, args);
//把业封装成对象
advice.endMethod(object, method, args);
return o;
}
});
return proxy;
}
}
interface Advice {
void startMethod(Object object, Method method, Object[] args);
void endMethod(Object object, Method method, Object[] args);
}
class MyAdvice implements Advice {
private long startTime ;
private long endTime ;
public void startMethod(Object object, Method method, Object[] args) {
startTime = System.currentTimeMillis();
}
public void endMethod(Object object, Method method, Object[] args) {
endTime = System.currentTimeMillis();
System. out .println(method.getName() + "花了" + ( endTime - startTime )
+ "毫秒值" );
}
}
package java_5_AOP;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
public class AOPTest {
public static void main(String[] args) throws Exception{
InputStream ips = AOPTest.class .getResourceAsStream("/java_5_AOP/config.properties" );
FactoryBean fb = new FactoryBean(ips);
Object obj = fb.getProxy( "name" );
System. out .println(obj.getClass().getName());
//只能是collection类型,因为代理对象是一个接口的实现类是目标对象的兄弟所以不能强转为其他的:eg:ArrayList;
Collection o = (Collection )obj;
o.add( "qqq");
o.add( "www");
System. out .println(o.size());
}
}
分享到:
相关推荐
更快的理解动态代理 一个小小的程序 让复杂的问题简单化
实现动态代理的两种方式: 第一种是JDK提供的基于接口的动态代理,要求被代理的类必须至少实现一个接口。 2. 第二种是第三方cglib提供的基于子类的动态代理,。至少要继承一个类。 我们这里 来讲解,动态代理,以及...
对代理模式与Java动态代理类的理解说明
动态代理的实现原理,以及详细的注释和错误分析,理解动态代理的机制
1.主要理解动态代理的设计思想 2.理解连接池的设计思想以及优点
java动态代理实例 要想理解拦截器的知识 最好要先理解java动态代理这块
有利于我们理解动态代理的过程,讲解完以后我们再进行动态代理的原理解析,此讲解基于mybatis的环境已经搭建完成,并且已经实现了基本的用户类编写以及用户类的Dao接口的声明,下面是Dao层的接口代码 public ...
是一个描述动态代理的实例,用的是反射的方法,感觉还是比较容易理解得
使用java完成动态代理的演示代码,适合初学者理解动态代理的功能,进行参考,本代码是简单的demo代码,仅用于学习参考。
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
附件为java 动态代理实例,有全码,包括测试代码。 代码少,注释全。 对理解代理非常不错。
里面 jdk动态代理详细的讲解了 希望对你们有所帮助
Java程序的工作机制:Java对象都以单独的class文件存在,java虚拟机将其载入并执行其虚拟机指令。
通过一个简单例子来理解JDK动态代理的思想,资源为拷贝的视频讲解的内容。
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
在代理模式中,主要有两种类型:静态代理和动态代理。 1.静态代理: 静态代理是指在编译期间就已经确定代理类和被代理类的关系,需要手动编写代理类。代理类需要实现与被代理类相同的接口,并且在代理类中持有一个被...
本资源利用文档加源码的方式较详细的介绍了JDK 动态代理和Spring的AOP机制.相信对您理解相关方面的知识有很大作用.
描述了spring动态代理德原理,对于一些初学者来说,理解起来也是更加容易!
jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...
本资源包含了博主博客中的代码,用一个黄牛买票的例子帮助新手理解静态代理与动态代理的原理