黑马程序员----------反射

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 一、Class类
  Class类的实例表示正在运行的 Java 应用程序中的类和接口。这个类没有构造方法,但是可以通过3种方法获取class对象:
  1. Class class1 = String.class;  //通过 类名.class
  2. Class class2 = (new String()).getClass(); //通过某类的一个实例
  3. Class class3 = Class.forName("java.lang.String"):// Class.forName(完整类名)
  
  一个类只能对应一个Class实例。
  Class有九个预定义的Class对象:八个基本类型加一个void。我们可以通过isPrimitive()方法来判断是否是基础类型。基础类型的它的包装类字节码不同,int.class!=Integer.class ,我们可以通过TYPE获取他所包装的那个基本数据类型的那份字节码,所以int.class==Integer.TYPE。同时数组不是基本数据类型,int.class和int[].class的字节码不同 ,我们可以通过isArray()来判断是否是数组。
  
二、反射
  反射就是指将java类中的各种成分映射成一个个java类。一个类中的每个成员都可以用相应的反射api类的一个实例对象来表示。
  
  反射常用的类有Construtor类、Field类、Method类。
  
  1.Construtor类
   Construtor类的实例对象为java类的构造方法,通过Class类的getConstrutor()或getConstrutors()获取构造方法。
   如:
    Construtor const = Class.forName("java.lang.String").getConstrutor(StringBuffer.class);
   然后通过newInstance()方法来获取该构造方法的实例,该实例为Object类型。
    String str = (String)const.newinstance(new StringBuffer("黑马"));
  2.Method类
   Method类的实例对象为java类的方法,通过Class类的getMethod()或getMethods()获取构造方法。
    String str2 = new String("asd123");
    Method met = str2.getClass().getMethod("replace",char.class,char.class);
   通过invoke()来实现
    String str3 = metinvoke(str2,'a','s'); 
  3.Field类
   通过getField()来获取参数
    Field fie=obj.getClass().getField("x");
   通过get(),set()来获取修改值
    fie.get(obj);
   如果要获取的参数为私有,可以暴力获取
    Field fie=obj.getClass().getDeclaredField("x");
    fie.setAccessible(true);
  4.数组的反射
   具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
   基础类型的数组,在反射中视为一个Object,无法通过Arrays.asList()方法。
   打印多维数组,我们可以通过递归来解决

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class FansheDemo{
	public static void main(String[] args) throws Exception {	
		int [][] inty = {{1,2,3 },{4,5,6}};
		printObject(inty);
	}
		
	public static void printObject(Object obj){
		Class classobj = obj.getClass();
		if (classobj.isArray()){
			int len = Array.getLength(obj);
			for (int index = 0;index<len;index++){
				if (Array.get(obj, index).getClass().isArray()){
					printObject(Array.get(obj, index));
					System.out.println();
				}
				else
					System.out.print(Array.get(obj, index)+" ");	
			}		
		}
		else
			System.out.print(obj+" ");
	}
}


 


 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值