------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+" ");
}
}