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. poj2509---抽k根烟就换一支,求能抽烟的总数

    #include <stdio.h> #include <stdlib.h> int main() { int now,k; while(scanf("%d %d&q ...

  2. rsyslog 配置

    在Debian环境下: 1,配置文件在/etc/rsyslogd.conf下: 2,如果要增加配置,并且不想直接修改rsyslogd.conf文件,可以在/etc/rsyslog.d/目录下增加文件, ...

  3. 剑指offer 22 栈的压入、弹出序列

    class Solution { public: bool IsPopOrder(vector<int> pushV,vector<int> popV) { bool resu ...

  4. 【分享】事实上,你VS界面也可以如此,VS界面美化

    阿土.它直接在地图上. 第一节目:Transformers(变形金刚) 第二方案:Assassin's Creed (刺客信条) watermark/2/text/aHR0cDovL2Jsb2cuY3 ...

  5. win8.1 安装webaccess遇到的写访问权限错误

    大学的时候闲暇时间都用来玩游戏了,现在工作了,就把工作中遇到的问题和学习心得跟大家共享下,若有不对的地方欢迎指出,谢谢! 前几天突然想换用vs2013开发,就重装了win8.1系统,在新系统上安装we ...

  6. 在win7下装ubuntu(硬盘版安装)及遇到的问题

    都怪自己弄什么Ubuntu下的Android Studio,因为GFW,gradle总下载不了,用命令行下载一半关机了,然后Ubuntu就这样被我搞残废了.又张罗着重装. 其实就是参照网上的帖子,算是 ...

  7. C# 如何从List集合当中取出子集合

    今天项目要求随机从数据库中随机取出若干条数据,放到首页.那么要如何随机取出这个子集合呢?本人向到的方法如下: 1.假设数据量很少,如我数据库中只有10条数据,而我要求随机取出8条.对于这种低数据量,大 ...

  8. JSTL入门

    在页面最上方引入 -------------------- if语句 8}"> b的值大于8 --------------------- foreach语句 i的值是:${i}

  9. C++から広がり

    泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库.所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能 ...

  10. PHP学习(前言)

    PHP学习(前言) 都说做IT技术的都该写写博客,以前没写过,现在开始写写吧.不是给别人看,就当是自己的学习笔记了. 大三结束了,该找工作了,对web前端感兴趣,想从事前端工作,自然要会一门后台语言了 ...