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("
================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("
================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(" ---------------处理一个OK--------------------"); coll.add("开始工作3"); System.out.println(" ---------------处理一个OK--------------------"); coll.add("开始工作2"); System.out.println(" ---------------处理一个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(" ---------------处理一个OK--------------------"); coll.add("开始工作2"); System.out.println(" ---------------处理一个OK--------------------"); System.out.println(coll.size()); } }