Java进阶-反射

反射机制

JAVA反射机制是在运行状态中,
对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

反射相关类

在这里插入图片描述

下面通过几个具体例子来了解反射的所有基本的常用相关方法!!

反射的作用(举例说明)

可通过反射机制,
通过一个类A实例化的对象a(或者类名);
访问a的实例域(成员变量),所有方法(函数),
以及 类A的所有构造方法,以及Static变量或方法。

1 获得CLASS类

Class cl; 
String ClassName = "java.lang.String";
String str = "abcdefg"; 
try { 	cl = Class.forName(ClassName); 	第一种方法 通过类名
		cl = str.getClass(); }		    第二种方法 通过对象

catch (ClassNotFoundException e) 
	  { e.printStackTrace(); }

2 获得并打印类A的所有构造方法的细节

public static void printConstructors(Class cl){ 		

Constructor[]  constructors = cl.getDeclaredConstructors();  	获得类A的所有构造方法

for (Constructor constructor : constructors)   						遍历构造方法
   { 		String name = constructor.getName();
			System.out.print("\n	"); 			
			String modifiderString  = Modifier.toString(constructor.getModifiers()); 	ModierString中保存构造方法中所有的访问修饰符		
			if(modifiderString.length()>0) 
			{
				System.out.print(modifiderString+" ");  输出所有的访问修饰符
			} 			
			System.out.print(name+"("); 			      输出构造方法名字 
			Class[] paratypes = constructor.getParameterTypes(); 			输出参数类型
			for (int j = 0; j < paratypes.length; j++) {            
				if (j>0) {
					System.out.print(","); 多个参数用空格分隔
				}
				System.out.print(paratypes[j].getName()); 			
				} 			

			System.out.print(")"); 		
   } 	
}

3 获得并打印类A的所有方法的细节

public static void printMethods(Class cl){

		Method[] methods = cl.getDeclaredMethods();        获得类A的所有方法

		for (Method method : methods) {							遍历方法
			Class retype  = method.getReturnType();		       方法返回值
			String name = method.getName();  					 方法名
			String modifiers  = Modifier.toString(method.getModifiers());    访问修饰符
			System.out.print("\n	");
			if (modifiers.length()>0) {
				System.out.print(modifiers+" "+retype.getName()+" "+name+"(");
			}
			Class[] parameters = method.getParameterTypes();
			for (int i = 0; i < parameters.length; i++) {
				if (i>0) {
					System.out.print(",");
				}
				System.out.print(parameters[i].getName());
			}
			System.out.print(")");
		}
	}

4 获得并打印类A的所有实例域细节

	public static void printfield(Class cl){
		Field[] fields = cl.getDeclaredFields();  获得所有实例域(成员变量)
		for (Field field : fields) {					遍历
			System.out.print("\n	");		
			Class type = field.getType();			获取成员变量类型
			String modiferString  = Modifier.toString(field.getModifiers());  访问修饰符
			if (modiferString.length()>0){
				System.out.print(modiferString+" ");
			}
			System.out.print(type.getName()+" "+field.getName());   成员变量名
			
		}
	}

5 访问任意对象的所有实例域及其值

Field[] fields = cl.getDeclaredFields();  			获取所有实例域
AccessibleObject.setAccessible(fields, true);		获取访问权限
for (Field f : fields) { 							遍历实例域
System.out.print("\n"+f.getName()+" ");
Object obj = f.get(a);								获取对象a的f实例域的值,在obj中保存	
Class t = obj.getClass();
if (t.isPrimitive()) {	基本数据类型
	System.out.print(obj);
}else {					引用类型
	System.out.print(obj.toString());
    }
}

5 访问任意对象的任意方法

Method m = cl.getDeclaredMethod("方法名",方法参数列表.class);
m.setAccessible(true);                获取访问权限
m.invoke(a,方法参数);				  调用对象a的m方法
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值