------- android培训、java培训、期待与您交流! ----------
反射: 就是把java类中的各种成分映射成相应的类。 java中的所有成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些对象。
java.lang.reflect 中的主要类
一. Class类:
所有的类都可以向上抽象,在内存中就是一种字节码,于是Class类就是用来描述这些字节码的一个类。
java中获取字节码的方式有三种:
1.类名.class Class cls1 = System.class;
2.对象名.getClass()String str1= ""; Class cls2 = str1.getClass();
3.Class.forName("类名")Class cls3 = Class.forName("String")
4.primitive wrapper classes 基本数据类型对象包装类.TYPE
java中有9个预定义对象不包括上面的第2.3 种方式,他们跟其他的类不一样,Primitive字节码,包括8个基本数据类型和void这个空返回值类型。
byte .Class | Byte .TYPE |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
bool | Boolean |
void | Void |
isPrimitive() 方法用来判断一个字节码对象是不是primitive的。
因为内存中对于一个类只有一个字节码,因此判断类型相同的时候应该用== 而非equals。 int.Class == Integer.Type 但是int.class != Integer.getClass()
二. Method类
Method类描述了所有的方法。
Method cls.getMethod(String name, Class... parameterTypes) 获取一个类中的指定方法
Method[] cls.getDeclaredMethods() 获取所有的方法
三. Constructor 类 构造方法
Constructor .getConstructor(Class... parameterTypes)
Constructor[].getConstructors()
四. Field类 类中定义的变量
getField(String name)
getConstructors()
Field对象.setAccessible(boolean flag) 如果要操作某个私有的属性,要先设为true,使其具有可操作性。
练习:将一个类中的String类型的变量中的字符‘b’改为‘a’
import java.lang.reflect.*;
/**
* @author Administrator
*
*/
public class ReflectTest {
/**
* Change all the String fields : change character 'a' to 'b'.
* @author Administrator
*/
public static void changeString() throws IllegalAccessException{
ReflectDemo1 rd1 = new ReflectDemo1("Lillian", "Shandong", "ball");
Class<? extends ReflectDemo1> cls1 = rd1.getClass();
Field[] fs1 = cls1.getDeclaredFields();
for(Field field : fs1){
if(field.getType() == String.class){
field.setAccessible(true);
String oldValue = (String) field.get(rd1);
String newValue = oldValue.replace('a', 'b');
field.set(rd1, newValue);
}
}
System.out.println(rd1);
}
}
/**
* A class ReflectDemo1, has a constructor with three parameters of String type.
*
* @author Administrator
*
*/
class ReflectDemo1{
private String name="NoName";
private String address="China";
public String habit="NoHabit";
public ReflectDemo1(String name, String address, String habit){
this.name = name;
this.address = address;
this.habit = habit;
}
@Override
public String toString(){
return this.name+"...."+this.address+"..."+this.habit;
}
}