java代理课程测试 spring AOP代理简单测试
jjava加强课程测试代码 反射、 代理 、泛型、beanUtils等 项目源码下载:http://download.csdn.net/detail/liangrui1988/6568169
热身运动代码。。。。。。。。。
package com.proxyTest; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection; public class ProxyTest { public static void main(String[] args) throws Exception{ //获取代理字节码
Class clazzProxy=Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class); System.out.println(clazzProxy.getName());
System.out.println("-----------Proxy构造方法列表------------");
Constructor[] constructor=clazzProxy.getConstructors(); for(Constructor con:constructor){
//get名称
String conName=con.getName(); //接接参数
StringBuilder sb=new StringBuilder(conName);//单线程 快
sb.append('(');
//get 获得参数类型的字节码
Class[] paraClass=con.getParameterTypes();
for(Class c:paraClass){
//获取参数
java加强课程测试代码 反射、 代理 、泛型、beanUtils等 sb.append(c.getName()).append(',');
} if(paraClass!=null&¶Class.length!=0)
sb.deleteCharAt(sb.length()-1); sb.append(')'); System.out.println(sb.toString());
} System.out.println("\n================Proxy方法列表============================="); Method[] methods=clazzProxy.getMethods(); for(Method me:methods){
//get名称
String conName=me.getName(); //接接参数
StringBuilder sb=new StringBuilder(conName);//单线程 快
sb.append('(');
//get 获得参数类型的字节码
Class[] paraClass=me.getParameterTypes();
for(Class c:paraClass){
//获取参数
sb.append(c.getName()).append(',');
} if(paraClass!=null&¶Class.length!=0)
sb.deleteCharAt(sb.length()-1); sb.append(')'); System.out.println(sb.toString());
} System.out.println("\n================Proxy创建实例=============================");
//获取指定的构造方法
Constructor conIns=clazzProxy.getConstructor(InvocationHandler.class); //创建一个connection类做参数
class myConn1 implements InvocationHandler{ @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
} } //创建实例
Collection proxy1 =(Collection) conIns.newInstance(new myConn1());
System.out.println(proxy1); // proxy1.size(); //创建实例 方式2===================================
@SuppressWarnings("unchecked")
Collection<String> proxy2 =(Collection<String>) conIns.newInstance(new InvocationHandler(){
//内部类
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
} ); //创建实例 方式3===================================
Collection proxy3=(Collection) Proxy.newProxyInstance(
//类加载器
Collection.class.getClassLoader(),
// 参数数内型
new Class[]{Collection.class},
//参数值
new InvocationHandler(){
/**
* proxy 代理的对象
* method 代理对象的那个方法
* args 方法中传入的参数
*/
ArrayList target=new ArrayList();
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Long startTime= System.currentTimeMillis();
//方法调用 参数 目标对象和参数
Object obj=method.invoke(target, args);
Long endTime= System.currentTimeMillis();
System.out.println(method.getName()+"runTime of 用时:"+(endTime=startTime)); //死循环
// return method.invoke(proxy,args); //返回对象
return obj;
}}
); proxy3.add("aaaa");
proxy3.add("bbbb");
proxy3.add("ccccc");
// System.out.println(proxy3.size()); } }
进一步加强代码
package com.proxyTest; import java.lang.reflect.Method;
/**
* 通知接口
* @author liangrui
*
*/
public interface Advice { public void beforeMethod(Method m);//开始方法
public void afterMethod(Method m);//结束方法
//异常方法,前后方法 省略 }
package com.proxyTest; import java.lang.reflect.Method;
/**
* 实现自已的处理功能对象
* @author liangrui
*
*/
public class Myadvice implements Advice {
Long startTime=null;
@Override
public void beforeMethod(Method m) {
System.out.println("欢迎来到代理处理对象 开始方法");
startTime= System.currentTimeMillis(); } @Override
public void afterMethod(Method m) {
System.out.println("欢迎来到代理处理对象 执行之后处理的方法");
Long endTime= System.currentTimeMillis();
System.out.println(m.getName()+"runTime of 用时:"+(endTime=startTime));
} }
package com.proxyTest; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection; public class ProxyTests { public static void main(String[] args) { ArrayList target=new ArrayList();//代理目标对象
//获取代理 对象
Collection coll=(Collection) getProxy(target,new Myadvice()); /**
* 每次在执行自已方法的同时
* 都会执行自定义对象(MyAdivce)功能来进行处理
*/ coll.add("开始工作");
System.out.println("\n---------------处理一个OK--------------------");
coll.add("开始工作3");
System.out.println("\n---------------处理一个OK--------------------");
coll.add("开始工作2");
System.out.println("\n---------------处理一个OK--------------------");
System.out.println(coll.size()); } /**
* 代理处理方法 返回处理后的对象
* @param target 目标对象
* @param advice 通告
* @return
*/
public static Object getProxy(final Object target,final Advice advice){
Object proxyObj=Proxy.newProxyInstance(
target.getClass().getClassLoader()//类加载器
, target.getClass().getInterfaces()//参数类型
,new InvocationHandler() {//调用方法进行处理
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { //代理功能处理 把方法交给它进行处理
advice.beforeMethod(method);
//处理自已的方法
Object returnObj=method.invoke(target, args);
advice.afterMethod(method);
//返回处理后的对象
return returnObj;
}
}); return proxyObj;
} }
//spring AOP 简单的实现例子
package com.AopFramework; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; import com.proxyTest.Advice; public class FactoryBean { Properties pro=new Properties(); public FactoryBean(InputStream is){
try {
pro.load(is);//加载数据流得到配制信息
} catch (IOException e) {
e.printStackTrace();
}
} //通过Key获取对象
public Object getBean(String name){
//通过Key获取类路径
String classPath=pro.getProperty(name);
Object bean=null;
try {
//获取类的字节码
Class clazz=Class.forName(classPath);
//得到对象实例
bean=clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
} //如果是代理对象则返回代理对象
if(bean instanceof ProxyFactoryBean){
//强转为代理对象
ProxyFactoryBean proxyFactoryBean=(ProxyFactoryBean)bean; Object ProxyBean = null;
try {
//获取功能对象
Advice advice=(Advice) Class.forName(pro.getProperty(name+".advice")).newInstance();
//目标对象
Object target= Class.forName(pro.getProperty(name+".target")).newInstance();
proxyFactoryBean.setAdvice(advice);//为代理对象加入 功能对象
proxyFactoryBean.setTarget(target);//加入目标对象
//get代理对象
ProxyBean = proxyFactoryBean.getProxy();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//返回代理对象
return ProxyBean;
} //返回没有代理过的对象
return bean; }
}
package com.AopFramework; 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; import com.proxyTest.Advice; public class ProxyFactoryBean { private Advice advice;//代理通告对象
private Object target;//代理目标对象 /**
* 代理处理方法 返回处理后的对象
* @param target 目标对象
* @param advice 通告
* @return
*/
public Object getProxy() {
Object proxyObj=Proxy.newProxyInstance(
target.getClass().getClassLoader()//类加载器
, target.getClass().getInterfaces()//参数类型
,new InvocationHandler() {//调用方法进行处理
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { //代理功能处理 把方法交给它进行处理
advice.beforeMethod(method);
//处理自已的方法
Object returnObj=method.invoke(target, args);
advice.afterMethod(method);
//返回处理后的对象
return returnObj;
}
}); return proxyObj;
} //=======================================
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;
} }
config.properties 配置文件
#target
#xxx=java.util.ArrayList
#proxy
xxx=com.AopFramework.ProxyFactoryBean #target object
xxx.target=java.util.ArrayList
#advice object
xxx.advice=com.proxyTest.Myadvice
package com.AopFramework; import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection; import com.proxyTest.Myadvice; public class AopFrameworkTest {
public static void main(String[] args) {
//加载配制文件
InputStream is=AopFrameworkTest.class.getResourceAsStream("config.properties"); //创建工厂实例 ---》获得bean
Object obj=new FactoryBean(is).getBean("xxx");
//根据你入的名称和配制 打印获得的对象名称
System.out.println(obj.getClass().getName()); //打印测试
Collection coll=(Collection) obj; /**
* 每次在执行自已方法的同时
* 都会执行自定义对象(MyAdivce)功能来进行处理
*/ coll.add("开始工作");
System.out.println("\n---------------处理一个OK--------------------");
coll.add("开始工作2");
System.out.println("\n---------------处理一个OK--------------------");
System.out.println(coll.size());
} }
java代理课程测试 spring AOP代理简单测试的更多相关文章
- Spring AOP /代理模式/事务管理/读写分离/多数据源管理
参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...
- CgLib动态代理学习【Spring AOP基础之一】
如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发 ...
- jdk动态代理与cglib代理、spring aop代理实现原理
原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...
- jdk动态代理与cglib代理、spring aop代理实现原理解析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)
Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...
- Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式
Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...
- Spring Boot 2.X(八):Spring AOP 实现简单的日志切面
AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一 ...
随机推荐
- 字符编码和python使用encode,decode转换utf-8, gbk, gb2312
ASCII码 标准ASCII码使用7位二进制数表示大写或小写字母,数字0到9标点符号以及在美式英语中使用的特殊控制字符. 在标准ASCII码中,最高位(b7)用作奇偶校验位,所谓奇偶校验,是指在代码传 ...
- poj1663---纯粹找规律
#include <stdio.h> #include <stdlib.h> int main() { int n; scanf("%d",&n); ...
- padding-top、margin-top和top的区别
padding-top:10px;是指容器内的内容距离容器的顶部有10个像素,是包含在容器内的: margin-top:10px;是指容器本身的顶部距离其他容器有10个像素,不包含在容器内: top: ...
- oracle查看所有表及字段
oracle表设计 http://blog.csdn.net/lanpy88/article/details/7580820 Oracle查看所有表和字段 获取表: select table_name ...
- cors技术
简称跨域资源共享: 若是配置nodejs: 需在公共路由添加三句话:代码如下: // 全局头设置 app.all('*', function(req, res, next) { res.set({ ' ...
- The Hardest Problem Ever(字符串)
The Hardest Problem Ever Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24039 Accept ...
- js中字符串方法
字符串方法: 1. charAt(索引值)//通过索引值获取字符串中对应的值 例如: var str='sdf123'; alert(str.charAt(0));//结果弹出第一个索引对应的值:s
- Netty之ChannelOption
一.概述 最近在写一个分布式服务框架,打算用netty框架做底层网络通信,关于netty的学习可以参考如下资料: http://blog.csdn.net/column/details/enjoyne ...
- B - 确定比赛名次
B - 确定比赛名次 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit S ...
- BZOJ 4321: queue2( dp )
dp(i, j, 1)表示前i个, 有j对是不合法的, i和i-1是在一起的. dp(i, j, 0)表示前i个, 有j对是不合法的, i和i-1不在一起的. 转移我们只需考虑是多了一对不合法的还是少 ...