java反射测试代码!枚举测试,beanUtils测试等....挺有用的。。。
完整通过反射自定义框架请看别一个博客:http://blog.csdn.net/liangrui1988/article/details/9348299
jjava加强课程测试代码 反射、 代理 、泛型、beanUtils等 项目源码下载:http://download.csdn.net/detail/liangrui1988/6568169
部分代码:
package com.zhang.test; import java.lang.reflect.Method; public class MethodTest { public static void main(String[] args) throws Exception { System.out.println("hello...."); //参数,类完整路径 String startClassName=args[0]; //startClassName="com.zhang.test.TestReflect"; //获得startClassName方法 main Method method=Class.forName(startClassName). getMethod("main",String[].class); //调用方法 method.invoke(null, new Object[]{new String[]{"123","3333"}}); } } // class TestReflect{ public static void main(String[] args){ for(String a:args){ System.out.println(a); } } }
package com.zhang.test; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Date; import java.util.List; public class GenericityTest { public static void main(String[] args) throws SecurityException, NoSuchMethodException { Beans be=new Beans(); List<Beans> list=new ArrayList<Beans>(); //能过反射获原方法, Method m=GenericityTest.class.getMethod("getGenricType", List.class,Date.class); //获取方法泛型内型 Type[] t=m.getGenericParameterTypes(); //获取第一个参数 内型 ParameterizedType p =(ParameterizedType) t[0]; //获取方法参数原生内型 (集合) System.out.println(p.getRawType()); //获取集合泛型的内型 System.out.println(p.getActualTypeArguments()[0]); //得到参数内型中的泛型内型 Type type= p.getActualTypeArguments()[0]; System.out.println(be.getClass()); //通过反射获取的集合泛集内型和对象内型比较,是一样的 if(be.getClass()==type){ System.out.println("======"); } } public void getGenricType(List<Beans> list,Date d){ } public void getGenricType2(Date d){ } }
package com.zhang.test; public class HashCodeTest { String x="aq"; String y="bb"; int xx; int yy; public static void main(String[] args) { } public HashCodeTest(int xx, int yy) { this.xx = xx; this.yy = yy; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((x == null) ? 0 : x.hashCode()); result = prime * result + xx; System.out.println("result:"+result); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; HashCodeTest other = (HashCodeTest) obj; if (x == null) { if (other.x != null) return false; } else if (!x.equals(other.x)) return false; if (xx != other.xx) return false; return true; } public String getX() { return x; } public void setX(String x) { this.x = x; } public String getY() { return y; } public void setY(String y) { this.y = y; } public int getXx() { return xx; } public void setXx(int xx) { this.xx = xx; } public int getYy() { return yy; } public void setYy(int yy) { this.yy = yy; } }
package com.zhang.test; import java.util.Collection; import java.util.HashSet; public class HashMian { public static void main(String[] args) { HashCodeTest h1=new HashCodeTest(2,3); HashCodeTest h3=new HashCodeTest(6,7); HashCodeTest h4=new HashCodeTest(6,7); Collection c=new HashSet(); c.add(h1); c.add(h3); c.add(h4); c.add(h1); //没有实现hashCode就等于3 因为他把HashSet分了若干个区 //当值去做比较时,他是相据hashCode算出区找值比较,发现没有就存下来了 System.out.println(c.size()); //实现hashCode 当值发生改变时,集合不会删掉 //因为在删除时它去找hashCode的值,发现没有了(h1已改变) //会造成内存泄露 h1.xx=100; c.remove(h1); System.out.println(c.size()); } }
package com.zhang.test; import java.beans.PropertyDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.lang.reflect.Method; import java.util.Map.Entry; import java.util.Properties; public class LoadProperties { public static void main(String [] args) throws Exception { // TODO Auto-generated method stub InputStream is=new FileInputStream("config.properties"); //k=v 集合 Properties pt=new Properties(); //加载文件 得到集合中 pt.load(is); is.close(); for(Entry e:pt.entrySet()){ System.out.println(e.getKey()+": "+e.getValue()); } System.out.println("key1: ="+pt.get("key1")); //加载文件 到流中 在class目录下 查找你要加载的文件 // InputStream ips= LoadProperties.class.getClassLoader().getResourceAsStream("com/zhang/test/config.properties"); //相对路径中查找文件 InputStream ips= LoadProperties.class.getResourceAsStream("config.properties"); Properties pt2=new Properties(); //加载文件 得到集合中 pt2.load(ips); System.out.println("key2: ="+pt2.get("key2")); //内省 获取属性的方法 读取值 HashCodeTest hct=new HashCodeTest(5,6); String field="xx"; //字段 》 对象字节码 PropertyDescriptor pd=new PropertyDescriptor(field,hct.getClass()); Method m=pd.getReadMethod();//只读方法 Object reflctValue=m.invoke(hct);//调用 对象中的方法 //获得方法返回结果 System.out.println(reflctValue); //获取xx写的方法 Method m2=pd.getWriteMethod(); m2.invoke(hct, 88); System.out.println(hct.getXx()); } }
//枚举测试
package com.emun.test; public abstract class WeekDay { private WeekDay(){} //内部类实现 public final static WeekDay SUN=new WeekDay(){ //重写父类的方法 @Override public WeekDay nextWeekDay() { return MON; } }; public final static WeekDay MON=new WeekDay(){ //重写父类的方法 @Override public WeekDay nextWeekDay() { // TODO Auto-generated method stub return SUN; } }; //抽象方法 public abstract WeekDay nextWeekDay(); /* public WeekDay nextWeekDay(){ if(this==SUN){ return MON; } else if(this==MON){ return SUN; }else{ return null; } }*/ //覆盖toString public String toString(){ //如果对象为sun 就转换为字符串 return this==SUN?"SUN":"MON"; } // 内部类 枚举,红,绿,黄,灯 public enum TrafficLamp{ RED{ //内部类重写父类的抽像方法 @Override public TrafficLamp nextLamp() { //红灯下一个是绿灯 return GREEN; } }, GREEN{ @Override public TrafficLamp nextLamp() { // TODO Auto-generated method stub return YELLOW; } }, YELLOW{ @Override public TrafficLamp nextLamp() { // TODO Auto-generated method stub return RED; } }; //下一个灯 public abstract TrafficLamp nextLamp(); } }
package com.emun.test; public class WeekdayTest { public static void main(String [] args) { System.out.println("下一个是:"+WeekDay.MON.nextWeekDay()); System.out.println("绿灯下一个是:"+WeekDay.TrafficLamp.GREEN.nextLamp()); } }
beanUtils测试:
beanUtils jar下载地址:http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi
package com.beanUtilsTest; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; import com.zhang.test.Beans; public class BeanUtilsTest { public static void main(String[] args) throws Exception{ Beans bean=new Beans(); bean.setName("dd"); System.out.println(bean.getClass()); //BeanUtils获得对象的值 String s=BeanUtils.getProperty(bean, "name"); System.out.println(s); //BeanUtils设值对象的值 都 以String内型 BeanUtils.setProperty(bean, "id",88); System.out.println("id:"+bean.getId()); //必须是原始内型 PropertyUtils.setProperty(bean, "id","99"); System.out.println("id:"+bean.getId()); //设置map值 Beans beanMap=new Beans(); Map<String,String> map=new HashMap<String,String>(); /*map.put("id", "66"); map.put("name","hello");*/ BeanUtils.setProperty(map, "id", "55"); BeanUtils.setProperty(map, "name", "hello"); //读取map Iterator i=map.keySet().iterator(); while(i.hasNext()){ System.out.println("i:"+map.get(i.next())); } //方式二 for(Entry<String,String> e:map.entrySet()){ System.out.println("方式二k:"+e.getKey()); System.out.println("方式二v:"+e.getValue()); } //把map转为bean BeanUtils.populate(beanMap, map); System.out.println("beanMap:"+beanMap.getId()+" "+beanMap.getName()); //把bean转为map //Map m=BeanUtils.describe(bean); //================================================================= /** * 基本内型 * double,float,int,short,boolean,byte,char,long * */ //获得对象 Object obj=bean.getClass().newInstance(); //反射得到字段 Field s2=bean.getClass().getDeclaredField("name"); s2.setAccessible(true); //设值 Object value="小明"; //获得字段的内型 String fType=s2.getType().getSimpleName(); System.out.println("fType:"+fType); //如是都 是String if(fType.equals("String")){ if(value instanceof String){ s2.set(obj, value); } //如是其它的这样需转换 if(value instanceof Long){ s2.set(obj, value.toString()); } } //其它类型都需这样判断。。。。。。。。 Beans reBeans=(Beans) obj; System.out.println("通过反射对对象成功设值: "+reBeans.getName()); } }
//代理测试
package com.proxyTest; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; public class ProxyTest { public static void main(String[] args) { //获取代理字节码 Class clazzProxy=Proxy.getProxyClass(Connection.class.getClassLoader(),Connection.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){ //获取参数 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()); } } }