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代理简单测试的更多相关文章

  1. Spring AOP /代理模式/事务管理/读写分离/多数据源管理

    参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...

  2. CgLib动态代理学习【Spring AOP基础之一】

    如果不了解JDK中proxy动态代理机制的可以先查看上篇文章的内容:Java动态代理学习[Spring AOP基础之一] 由于Java动态代理Proxy.newProxyInstance()的时候会发 ...

  3. jdk动态代理与cglib代理、spring aop代理实现原理

    原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...

  4. jdk动态代理与cglib代理、spring aop代理实现原理解析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  5. 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  6. jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  7. Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)

    Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...

  8. Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式

    Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...

  9. Spring Boot 2.X(八):Spring AOP 实现简单的日志切面

    AOP 1.什么是 AOP ? AOP 的全称为 Aspect Oriented Programming,译为面向切面编程,是通过预编译方式和运行期动态代理实现核心业务逻辑之外的横切行为的统一维护的一 ...

随机推荐

  1. 三维CAD塑造——基于所述基本数据结构一半欧拉操作模型

    三维CAD塑造--基于所述基本数据结构一半欧拉操作模型(elar, B_REP) (欧拉操作  三维CAD建模课程 三维CAD塑造 高曙明老师  渲染框架 brep 带洞 带柄 B_REP brep ...

  2. 关于虚拟机装kali-linux的联网问题

    我用的是VMware Workstation11,近期装了一个kali-linux,想玩一下password破解.没想到装上之后网络连接显示的是活跃的却无法上网,我试过桥接等其他方式去联网,却依然无法 ...

  3. Socket.io在线聊天室

    从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...

  4. c++ 文件读写(转)

    C/C++ code //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #include<iomanip.h> #include<fstream.h> ...

  5. 查看memcached依赖的库

    LD_DEBUG=libs ./memcached -v

  6. 关于express4不再支持body-parser

    express的bodyParser能将表单里的数据格式化,bodyParser原是绑定在express中的,但从express4开始,不在绑定了 如果依然直接使用app.use(express.bo ...

  7. 收集的jquery插件

    1.精美jQuery分页插件 带滑动条分页使用HTML5实现刮刮卡效果 今天开始我们来收集一些jQuery分页插件,今天第一款jQuery分页插件适用于长翻页列表的分页应用,因为这款分页插件带有滑动条 ...

  8. 《JavaScript+DOM编程艺术》的摘要(二)---DOM中的几个方法

    //DOM: //对象是一种独立的数据集合,与某个特定对象相关联的变量被称为这个对象的属性,通过某个特定对象可以为之调用的函数被称为这个对象的方法 // //4个非常实用的DOM方法: //检索特定元 ...

  9. svn添加强制注释,pre-commit结合python

    鉴于组内有些人在提交代码的时候并不写注释,而且没有固定格式,所以准备给svn提交时增加强制注释. 首先找到代码库里的hooks目录,正常建svn库的时候都有这个目录.进入hooks目录,找到pre-c ...

  10. Android学习路径图

    一个PHPer转战Android学习过程: 直接跨过java的学习,原因有我之前看过毕向东和张孝祥的Java基础课程,虽然中间好几次看睡着,但java的环境是能跑起来的.我建议大家如果没有Java基础 ...