您的位置:首页 > 编程语言 > Java开发

《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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: