Java的反射机制,是在运行的状态中,对与任何一个类,都能够知道这个类所有的属性和方法。对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。
反射机制获取类有三种方法:
1.使用Class类的forName静态方法
Class c1=Class.forName("类名");
2.直接获取某一个对象的class(Java中每个类型都有class属性):
Class<?> c2=int.class;
Class<?> classInt=Integer.Type;
3.调用某个对象的getClass()方法(Java中的每个对象都有getClass方法):
StringBuilder str=new StringBuilder("123456");
Class<?> c3=str.getClass();
创建实例(两种方法)
1.使用Class对象的newInstance()方法 来创建Class对象对应的实例
Class<?> c=String.class;
Object str=c.newInstance();
2.先通过Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance()来创建实例。这种方法可以用指定的构造器构造类的实例。
Class<?> c=String.class; //获取String所对应的Class对象
Constructor constructor = c.getConstructor(String.class); //获取String类带一个String参数的构造器
Object obj = constructor.newInstance("hello,world"); //根据构造器创建实例
System.out.println(obj);
获取属性
//获取整个类
Class c=Class.forName("java.lang.Integer");
//获取所有的属性
Field[] fs=c.getDeclaredFields();
//定义可变长的字符串,用来存储属性
StringBuffer stringBuffer=new StringBuffer();
//通过追加的方法,将每个属性拼接到此字符串中
//最外边的public定义
stringBuffer.append(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName()+" {\n");
//里面的每一个属性
for(Filed field:fs){
//空格
stringBuffer.append("\t");
//获得属性的修饰符,例如public,static等等
stringBuffer.append(Modifier.toString(filed.getModifiers())+" ");
//属性的类型的名字
stringBuffer.append(field.getType().getSimpleName()+" ");
//属性的名字+回车
stringBuffer.append(field.getName()+";\n");
}
stringBuffer.append("}");