三个例子讲清楚Java反射
2015-12-10 23:23
417 查看
通过三个例子分析java中反射的常见用法 from caicongyang
写在最后:高级程序员都通过代码理解API
记录与分享,你我共成长!我的其他精彩博客:http://blog.csdn.net/caicongyang
ReflectiveTest.java (反射类的基础API)
package com.ccy.reflective; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import org.junit.Test; /** * <p> * Title: ReflectiveTest.java * Package com.ccy.reflective * </p> * <p> * Description: 反射API测试类 * <p> * @author Tom.Cai * @created 2015-12-10 下午10:30:12 * @version V1.0 * */ public class ReflectiveTest { /** * 反射获取类信息 */ @Test public void reflectiveGetClassInfo(){ try { Class cls = Class.forName("java.lang.String"); //获取父类 Class superclass = cls.getSuperclass(); System.out.println(superclass.getName()); //获取类的修饰符 int modify = cls.getModifiers(); String retval = Modifier.toString(modify); System.out.println(retval); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 反射获取类的构造函数 */ @Test public void reflectiveGetConstructors(){ try { Class cls = Class.forName("java.lang.String"); //获取构造方法 Constructor<String>[] declaredConstructors = cls.getDeclaredConstructors(); for(Constructor<String> con:declaredConstructors){ //获取构造方法的名称 String name = con.getName(); System.out.println(name); //获取构造方法的修饰符 int conModify = con.getModifiers(); String conRetval = Modifier.toString(conModify); System.out.println(conRetval); //循环获取构造函数的参数 Class<?>[] parameterTypes = con.getParameterTypes(); for(int i = 0;i<parameterTypes.length;i++){ System.out.println(parameterTypes[i].getName()); } System.out.println("------"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 反射获取类的字段 */ @Test public void reflectiveGetClassFields(){ try { Class cls = Class.forName("java.lang.String"); Field[] fields = cls.getDeclaredFields(); for(Field f:fields){ //获取字段类型名称 Class<?> type = f.getType(); String typeName = type.getName(); System.out.println(typeName); //获取字段修饰符 int modify = f.getModifiers(); String modifyName = Modifier.toString(modify); System.out.println(modifyName); //获取字段名称 String filedName = f.getName(); System.out.println(filedName); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 反射获取类方法信息 */ @Test public void reflectiveGetClassMethods(){ try { Class cls = Class.forName("java.lang.String"); Method[] declaredMethods = cls.getDeclaredMethods(); for(Method m:declaredMethods){ //获取还回类型名称 Class<?> returnType = m.getReturnType(); String returnTypeName = returnType.getName(); System.out.println(returnTypeName); //获取方法修饰符 int modifiers = m.getModifiers(); String modifiersName = Modifier.toString(modifiers); System.out.println(modifiersName); //循环获取参数类型名称 Class<?>[] parameterTypes = m.getParameterTypes(); for(int i=0;i<parameterTypes.length;i++){ String parameterName = parameterTypes[i].getName(); System.out.println(parameterName); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
ReflectiveTest2.java(运行时反射获取字private段属性值)
package com.ccy.reflective; import java.lang.reflect.Field; import org.junit.Test; /** * * <p> * Title: ReflectiveTest2.java * Package com.ccy.reflective * </p> * <p> * Description: 运行时反射获取类字段值 * <p> * @author Tom.Cai * @created 2015-12-10 下午10:56:40 * @version V1.0 * */ public class ReflectiveTest2 { @Test public void runTimeReflective(){ Person person = new Person(); person.setAge(25); person.setName("Tom"); try { Class<? extends Person> cls = person.getClass(); Field[] fields = cls.getDeclaredFields(); for(Field field :fields){ field.setAccessible(true); System.out.println(field.getName()); System.out.println(field.get(person)); } } catch (Exception e) { e.printStackTrace(); } } class Person{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } }
ReflectiveTest3.java(通过反射实现已填充数组的长度自增长通过方法)
package com.ccy.reflective; import java.lang.reflect.Array; /** * <p> * Title: ReflectiveTest3.java * Package com.ccy.reflective * </p> * <p> * Description: 通过反射实现已填充对象数组的自增长 * <p> * @author Tom.Cai * @created 2015-12-10 下午11:12:38 * @version V1.0 * */ public class ReflectiveTest3 { public static void main(String[] args) { int[] a ={1,2,3}; a = (int[]) goodArrayGrow(a); System.out.println(a.length); } /** * 通过反射实现已填充对象的数组自增长 10%+10 * @param object * @return */ public static Object goodArrayGrow(Object object){ Class cls = object.getClass(); if(!cls.isArray()){ return null; } Class componentType = cls.getComponentType(); int length = Array.getLength(object); int newLen = length * 11/10+10; Object newArray = Array.newInstance(componentType, newLen); System.arraycopy(object, 0, newArray, 0, length); return newArray; } }
写在最后:高级程序员都通过代码理解API
记录与分享,你我共成长!我的其他精彩博客:http://blog.csdn.net/caicongyang
相关文章推荐
- Java线程2-4 单任务线程池SingleThreadPool
- java并发--队列同步器原理一
- 第三个spring冲刺第4天
- java多线程模拟聊天问题
- JAVA面向对象
- Java线程2-3 时间调度的线程池ScheduledThreadPool
- Struts2框架学习之三:result返回结果
- Spring配置文件所有类型的数据源dataSource
- java web 答辩总结
- java.lang.IndexOutOfBoundsException 错误解决
- Java线程2-2 固定大小的线程池FixedThreadPool
- Java线程2-1 线程池知识学习
- java中的原子类
- java运算符
- struts常见面试题目
- spring常见面试题目
- eclipse jetty插件的安装
- Java并发编程:volatile关键字解析
- Java回炉之排序算法
- java并发编程--同步队列器初探