锁定老帖子 主题:java反射机制学习
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-19
在java运行时环境中,对于任意一个类,能够动态的获取类的信息,动态调用类的方法。 在运行期间:判断,构造,调用任意一个类的成员变量和方法。而在编译期间:我们是用new 创建java的对象。 通过reflection机制,我们可以在运行时取得任何一个已知名称的class的内部信息,包括其修饰符,以及superclass,interfaces,也包括fields和methods的所有信息。 在jdk中主要由以下类来实现java反射机制: -class类, -Field类, -Mehtod类, -Array类。 ------------------ 动态语言定义:程序运行时,允许改变程序结构或者变量类型,这种语言称为动态语言。从这个观点看,perl,python,ruby,javasacript是动态语言,c++,java,c#不是动态语言。但是java却有一个非常突出的动态相关机制,Reflection。 ---------------------- 1.要想使用反射,首先需要获得待处理类或对象的class对象 2.获取class的三种方法。 1)通过Class.forName(""); 2)通过类.class,eg:string.class; 3)通过对象的 obj.getClass(); 3.若想通过类的不带参数的构造方法生成对象,有两种方式: a)先获得class对象,然后通过class对象的newInstance()方法直接生成即可 b)先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class; Constructor cons=classType.getConstructor(new Class[]{}); Object obj=new cons.newInstance(new Object[]{}); 4. 若想通过类的带参数的构造方法生成对象,只有一个方法: 先获得class对象,然后通过该对象获得对应的Constructor对象,再通过该Construtor对象的newInstance()方法生成;Class<?> classType=StringBuffer.class; Constructor cons=classType.getConstructor(new Class[String.class,int.class]{}); Object obj=new cons.newInstance(new Object[]{"abing",5}); 5.通过反射可以调用一个对象的private方法,或者修改一对象的private属性。 import java.lang.reflect.Field; import java.lang.reflect.Method; class User{ private String userName=""; public String getUserName() { return userName; } public int add(int a, int b) { return a + b; } private int minus(int a,int b) { return a-b; } } public class ReflectTest { /** * @param args */ public static void main(String[] args) throws Exception { Class<?> classType=Class.forName("User");//得到class对象 Method[] meth=classType.getDeclaredMethods();//得到该class所有声明method for (Method method : meth) { System.out.println("method:"+method); } Field [] fiel=classType.getDeclaredFields();//得到该class所有声明field for (Field field : fiel) { System.out.println("fiueld:"+field); } User user=(User)classType.newInstance();//通过class获得User对象 Method method=classType.getMethod("add",new Class<?>[]{int.class,int.class});//获取add方法,考虑到方法重载,还要加上参数条件才能唯一限定一个方法 int result=(Integer)method.invoke(user, new Object[]{3,9});//通过invoke调用方法 System.out.println("addresult:"+result); /** * 通过反射来访问方法的私有方法 */ Method methodminus=classType.getDeclaredMethod("minus",new Class<?>[]{int.class,int.class});//通过getDeclaredMethod取得私有的方法 methodminus.setAccessible(true);//将可访问性设置为true int resultminus=(Integer)methodminus.invoke(user, new Object[]{3,9});//通过invoke调用方法 System.out.println("resultminus:"+resultminus); /** * 通过反射来访问方法的私有属性 */ Field field=classType.getDeclaredField("userName"); field.setAccessible(true);//将可访问性设置为true field.set(user, "bingyingao");//给私有属性userName赋值 System.out.println(user.getUserName()); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-21
这些都是书上的,final的字段也可以修改的,LZ可以想办法试试看
|
|
返回顶楼 | |
发表时间:2011-11-21
温习一下知识哈
|
|
返回顶楼 | |
发表时间:2011-11-21
nhy520 写道
|
|
返回顶楼 | |
发表时间:2011-11-21
afunti 写道 nhy520 写道 [quote="nhy520]
afunti 写道 nhy520 写道 [quote="nhy520]
|
|
返回顶楼 | |
发表时间:2011-11-21
afunti 写道 afunti 写道 nhy520 写道 nhy520][quote="afunti 写道 nhy520 写道 [quote="nhy520] |
|
返回顶楼 | |
发表时间:2011-11-21
afunti 写道 afunti 写道 afunti 写道 nhy520 写道 nhy520“][quote="afunti 写道 nhy520 写道 [quote="nhy520] |
|
返回顶楼 | |
发表时间:2011-11-21
不好意思
我这是在仿照javaeye的引用回复的功能 这是做个测试 如果打扰到你,在这里跟你道歉!! |
|
返回顶楼 | |
发表时间:2011-11-22
afunti 写道 不好意思
我这是在仿照javaeye的引用回复的功能 这是做个测试 如果打扰到你,在这里跟你道歉!! 碉堡了你 |
|
返回顶楼 | |
发表时间:2011-11-22
拉出去割了...
|
|
返回顶楼 | |