反射的基本使用实例
2014-12-30 17:48
197 查看
package com.franky.reflex; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * @描述 反射的基本使用实例 * @作者 franky * @日期 2014-12-30 下午4:08:34 */ public class ReflexTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String className = "com.franky.reflex.Person"; //得到Person类的Class对象,在编译时期,编译器并不知道得到的是哪个类的Class对象,因此需要转换 Class<Person> clazz = (Class<Person>) Class.forName(className); //得到无参的构造方法 Constructor<Person> consByNullPrams = clazz.getConstructor(); //得到有参的构造方法,参数也是Class对象 Constructor<Person> consByPrams = clazz.getConstructor(int.class,String.class); //实例化无参的构造方法的对象,可以由构造器实例化,也可以直接用Class对象实例化 consByNullPrams.newInstance(); Person person = clazz.newInstance(); //实例化有参的构造方法对象 Person person2 = consByPrams.newInstance(22,"tom"); //得到成员字段,私有字段需要设置访问权限为true进行访问 Field field = clazz.getDeclaredField("age"); //得到所有声明的字段数组 Field[] fields = clazz.getFields(); //设置访问权限 field.setAccessible(true); //得到字段所在对象的值 int age = (int) field.get(person2); System.out.println(age); //遍历公开的字段并替换其中的字符 for (Field f : fields) { if(f.getType() == String.class){ String str = (String) f.get(person2); str = str.replace('a', 'x'); f.set(person2, str); } } System.out.println(person2); //得到成员方法并调用 Method method = clazz.getMethod("setAge", int.class); //如果method.invoke(null,args)第一个参数为Null时候,代表调用的是静态方法 method.invoke(person2, 55); //JDK1.4的调用方式,参数可以是Object数组 method.invoke(person2, new Object[]{66}); System.out.println(person2.getAge()); } }
Person类
package com.franky.reflex; /** * @描述 测试反射的Person类 * @作者 franky * @日期 2014-12-30 下午5:53:14 */ public class Person { private int age; private String name; public String str1 = "aaaaaaaaaaaaa"; public String str2 = "bbbbbbaaaaaaa"; public String str3 = "ccccccaaaaaaa"; /** * @return the age */ public int getAge() { return age; } /** * @param age the age to set */ public void setAge(int age) { this.age = age; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } public Person(int age, String name) { super(); this.age = age; this.name = name; } public Person() { } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Person [str1=" + str1 + ", str2=" + str2 + ", str3=" + str3 + "]"; } }
相关文章推荐
- 扩展方法的几个实例,扩展基本类型、接口、通过反射让扩展方法使用私有成员等
- 反射的基本使用实例
- Sniffer Pro的基本使用和实例
- 使用反射技术动态创建类对象(实例代码)
- 引用】C#反射实例(一) 利用反射使用类库
- 960 Grid System 基本使用实例
- [c#美味] 使用反射动态创建实例并调用方法
- 使用反射动态创建类的实例
- 反射-实例化一个未知的类(使用System.AppDomain类)
- 使用反射机制用一个类实例的值为DataTable添加一行
- 使用反射机制将一个类实例的值赋给DataTable某一行
- 960 Grid System 基本使用实例
- 反射使用的简单实例
- [转载]使用反射技术动态创建类对象(实例代码)
- Sniffer Pro的基本使用和实例
- 没有为实例"db2inst1"指定"快速连接管理器"(FCM)基本端口.将使用缺省参数
- 使用基本的ASP.NET服务器端控件的综合实例
- Sniffer Pro的基本使用和实例[图文]
- 使用反射机制将一个类实例的值赋给DataTable某一行
- c# 反射使用实例