《Java反射的应用》
2016-07-29 21:40
519 查看
《Java反射的应用》
最近在研究Java并发相关的类库,看到了AtomicIntegerFieldUpdater,这个类就是利用反射来完成原子更新字段的值。由于自己对反射相关的操作都忘记了,今天刚好借此机会就看了下API文档温习了一下。也写了一个小例子。例子中基本上涵盖了我们利用反射来获取类的属性、方法、构造函数等应用。
例子完成的功能:首先有一个Student类,然后我们利用反射机制获取类相关的属性和方法组合为一个字符串打印输出,最后我们利用反射获取某个指定属性和某个指定方法对其使用使用。
public class TestClass { private static Class c = null; public static void main(String[] args) throws Exception { try { //获取类 c = Class.forName("com.wrh.atomic.Student"); } catch (ClassNotFoundException e) { e.printStackTrace(); } String classContentStr = getClassInformation(); System.out.println(classContentStr); //对属性的使用 Field fId = c.getDeclaredField("id");//不能使用c.getField("id");因为getField只能返回公共属性 fId.setAccessible(true);//使用反射机制可以打破封装性,导致了java对象的属性不安全。 Object obj = c.newInstance(); fId.set(obj, 10); //System.out.println(fId.get(obj)); //调用方法 Method m =c.getDeclaredMethod("getId"); m.invoke(obj); Method m2 = c.getDeclaredMethod("setId", int.class); m2.invoke(obj, 4); } private static String getClassInformation() { StringBuffer sb = new StringBuffer(); sb.append(Modifier.toString(c.getModifiers())).append("class ").append(c.getSimpleName()).append(" {\n"); //获取所有的属性 Field[] fields = c.getDeclaredFields(); //获取属性的修饰符、类型和名字 for(Field f:fields){ sb.append("\t");//空格 sb.append(Modifier.toString(f.getModifiers())+" ");//属性的修饰符 sb.append(f.getType().getSimpleName()+" ");//属性类型的名字 sb.append(f.getName()).append(";\n");//属性的名字 } //获取所有的方法 Method[] methods = c.getDeclaredMethods(); for(Method m:methods){ sb.append("\t");//空格 sb.append(Modifier.toString(m.getModifiers())+" ");//修饰符 sb.append(m.getReturnType().getSimpleName()+" ");//返回值类型 sb.append(m.getName());//方法的名字 Class[] parameters=m.getParameterTypes(); //获得方法传入参数的类型 StringBuffer sbPara = new StringBuffer(); if(parameters.length!=0){ for(Class p:parameters){ sbPara.append(p.getSimpleName()+","); } sb.append("("+sbPara.substring(0,sbPara.length()-1)+")"); } else{ sb.append("()"); } sb.append("{\n");//添加换行符 sb.append("\t}\n");//添加方法的右大括号 } sb.append("}"); return sb.toString(); } } class Student{ private int id; private String name; private int age; public int getId() { System.out.println("get id :"+id); return id; } public void setId(int id) { System.out.println("set id :"+id); this.id = id; } 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; } }
关于反射更多的介绍请参考API文档。下面也贴出两篇比较好的反射博客
1、/content/735901.html
2、/article/4657750.html
相关文章推荐
- Java学习笔记(二):数据类型和运算符(2)
- java练习+数字特征值
- java常用函数一
- spring 问题解决汇总
- Java Web学习(26): JSTL学习(四)
- Springmvc+uploadify实现文件上传
- Java Bean以及xsd相互生成
- 002——第一个Spring程序
- Java设计模式--代理模式
- (2) Java类的加载
- spring+mybatis+log4j学习记录
- Spring aop 实现异常拦截
- Struts2-032/033/037/devMode漏洞演示环境搭建
- 【Java语言学习】之Comparator 和 Comparable 对比
- Java中的二维数组
- MyEclipse插件安装方法
- Java学习笔记之IO流中的文件字符流
- Thinking in Java——第六章-访问控制权限
- 【Java】Servlet调用流程
- Java学习笔记之IO流中的文件字节流