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());
}
}