反射机制的三种方式:
1.Class name = Class.forName("java.lang.String");//必须写类全名 将String类装在在虚拟机里面
2.Class name = String.class;、//不会执行静态语句块;
3.String str = new String();
// Object类里面的方法getClass(),所以每一个类都有这用方法;
Class name = str.getClass();
在以上三种使用中,其中第一种较为常用;以上这三种声明的对象都是指向内存里面的一个对象,它们的内存地址是相同的,
Object object =name.newInstance();
此方法生成一个反射类中的实例,注意newInstance()是在调用String类里面的无参构造,倘若反射类中没有无参构造此方法会报异常。
获取String类里面所有的属性:
name.getFields()获取的是String所有public 类型的
name.getDeclaredFields()是获取反射类中所有声明的属性 上面两个方法都是返回Fields[] 数组;
然后遍历这个数组:
for(int i=0;i<fields.length;i++){
System.out.println(Modifier.toString(fields[i].getModifiers()));//读取属性的修饰符 例如:private static final
System.out.println(fields[i].getType().getName()); //读取属性的类型 例如:String int
System.out.println(fields[i].getName());//读取属性的name 例如:age sex;
}
获取String类里面某个的属性(count):
Field field = name.getDeclaredField("count");
//因为count 的修饰符是private类型的,利用反射要打破封装,才能修改数据;
field.setAccessible(true);
Object o=name.newInstance();
field.set(o, 10);//把对象o里面的count属性值改为10
System.out.println("o:"+field.get(o));//读取count属性值;
获取String类里面方法:
Method[] declaredMethods = name.getDeclaredMethods();
for(Method m:declaredMethods){
//方法名字
System.out.println(m.getName());
//获取返回值类型
System.out.println(m.getReturnType());
//获取参数类型
Class<?>[] parameterTypes = m.getParameterTypes();
for(Class c:parameterTypes){
System.out.println(c.getSimpleName());
}
}
获取String类里面某个具体的方法:
m = name.getDeclaredMethod("contains", String.class);//获取反射类里面的contains方法;
Object newInstance2 = name.newInstance();//声明反射类的实例;
Object invoke = m.invoke(newInstance2, "123");//根据这个实例调用contains方法并且传入相应的参数
在上面这几方法里面其中获取某个属性复制和获取某个方法复制是比较常用的;不过用反射机制会影响项目的执行效率。