论坛首页 Java企业应用论坛

java反射机制学习

浏览 11698 次
精华帖 (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());
	}

}

   发表时间:2011-11-21  
这些都是书上的,final的字段也可以修改的,LZ可以想办法试试看
0 请登录后投票
   发表时间:2011-11-21  
温习一下知识哈
0 请登录后投票
   发表时间:2011-11-21  
nhy520 写道

0 请登录后投票
   发表时间:2011-11-21  
afunti 写道
nhy520 写道
[quote="nhy520]
afunti 写道
nhy520 写道
[quote="nhy520]






0 请登录后投票
   发表时间:2011-11-21  
afunti 写道
afunti 写道
nhy520 写道
nhy520][quote="afunti 写道
nhy520 写道
[quote="nhy520]

0 请登录后投票
   发表时间:2011-11-21  
afunti 写道
afunti 写道
afunti 写道
nhy520 写道
nhy520“][quote="afunti 写道
nhy520 写道
[quote="nhy520]
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

0 请登录后投票
   发表时间:2011-11-21  
不好意思
我这是在仿照javaeye的引用回复的功能
这是做个测试
如果打扰到你,在这里跟你道歉!!
0 请登录后投票
   发表时间:2011-11-22  
afunti 写道
不好意思
我这是在仿照javaeye的引用回复的功能
这是做个测试
如果打扰到你,在这里跟你道歉!!


碉堡了你
0 请登录后投票
   发表时间:2011-11-22  
拉出去割了...
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics