java的反射机制

在学习之前,先来看看百度百科是怎么解释它的吧:

什么是java的反射:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
java的反射能够做什么:
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;生成动态代理。
反射类的属性、构造方法、父类、接口和方法
java的反射的用法:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test {

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		
		demo1 demo = new demo1();
		Class a = demo.getClass();

		//取得demo的out 方法
		Method method = a.getMethod("out");
//		System.out.println(method.toString() + "");	
		//反射输出 out()
//		method.invoke(demo,null);
		
		//获得demo1的所有方法,包括父类的方法
		Method[] m = a.getMethods();
		
//		for(int i = 0 ;i < m.length ; i++){
//			System.out.println(m[i].toString() + "");
//		}
		
		//
		Method[] me = a.getDeclaredMethods();

//		for(int i = 0 ;i < me.length ; i++){
//			System.out.println(me[i].toString() + "");
//		}
		
		Class b = demo1.class;
		
		try {
			Class c = Class.forName("test.demo1");
			demo1 object = (demo1)c.newInstance();
			object.out();
			Method[] method1 = a.getDeclaredMethods();

			for(int i = 0 ;i < method1.length ; i++){
				System.out.println(method1[i].toString() + "");
			}
			
			//获得构造函数
			Constructor[] theConstructors = c.getConstructors();
			System.out.println("构造函数的数量:" + theConstructors.length );
			
			//获得类的所有公共的屬性
			Field[] fb =c.getFields();  
			for ( int  j= 0 ;j<fb.length;j++){  
			Class cl = fb[j].getType();  
			System.out.println("fb:" +cl);  
			}  
			
			System.out.println("反射类中所有的属性" );  
			Field[] fa = c.getDeclaredFields();  
			for ( int  j= 0 ;j<fa.length;j++){  
			String cl = fa[j].getName(); 
			System.out.println("fa:" +cl);  
			} 
			
			System.out.println("反射类中私有属性的值" );  
			Field f = c.getDeclaredField("b");  
			f.setAccessible(true );  
			Integer i = (Integer)f.get(object);  
			System.out.println(i);  
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
}

class demo1 {
	
	public demo1(){
		
	}
	
	public int a = 1;
	private int b = 2;

	public void out() {
		System.out.println("out。。。");
	}
	
	public void init(){
		System.out.println("a = " + a);
	}
}

详细用法 ,代码中有注释。我们可以通过反射来获取某个类的变量,方法,构造函数等信息;

比如我们在开发Android的时候 ,在就得api中是不包含某个函数的,所以 我们可以通过反射机制,在运行的过程中 查找是否含有这个方法。

如果我们想访问某个类的私有变量,也可以用反射获得。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值