类名.class是Class对象的句柄,每个被加载的类,在jvm中都会有一个Class对象与之相对应,如果要创建新的对象,直接使用Class对象的局部class.forName就可以了,不需要用new 类名。
在运行期间,如果我们要产生某个类的对象,java虚拟机会检测该类型的Class对象是否已被加载。如果没有加载,java虚拟机会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已经被加载到内存,就可以用它来产生该类型的所有对象。
newInstance()调用内中缺省的构造方法,创造该Class对象的一个实例,等价于直接new。
获取class实例的三种方式
1.利用对象调用getClass()方法获取该对象的Class实例
2.使用Class的静态方法forName(),用类的名字获取一个Class实例
3.运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例
Field f f.setAccessible(boolean);
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
1 public class FieldReflectDemo { 2 int i; 3 public float f; 4 protected boolean b; 5 private String s; 6 7 public FieldReflectDemo() { 8 i=0; 9 f=0.1f; 10 b=true; 11 s=""; 12 } 13 public static void main(String[]args){ 14 FieldReflectDemo frd=new FieldReflectDemo(); 15 16 Field[] fields=FieldReflectDemo.class.getDeclaredFields(); 17 for(Field field:fields){ 18 19 System.out.println("字段名字是"+field.getName()); 20 Class fieldType = field.getType(); 21 System.out.println("类型为:"+field.getType()); 22 boolean isTurn=true; 23 while(isTurn){ 24 try{ 25 isTurn=false; 26 System.out.println("修改前的值为:"+ field.get(frd)); 27 if(fieldType.equals(int.class)) 28 { 29 System.out.println("利用setInt()方法修改成员变量的值."); 30 field.setInt(frd, 124); 31 } 32 else if(fieldType.equals(float.class)) 33 { 34 System.out.println("利用setFloat()方法修改成员变量的值."); 35 field.setFloat(frd, 9.9f); 36 }else if(fieldType.equals(boolean.class)) 37 { 38 System.out.println("利用setBoolean()方法修改成员变量的值."); 39 field.setBoolean(frd, false); 40 } 41 else 42 { 43 System.out.println("利用set()方法修改成员变量的值."); 44 field.set(frd, "NWQ"); 45 } 46 System.out.println("修改后的值为:"+field.get(frd)); 47 48 }catch(Exception e){ 49 System.out.println("在设置成员变量的时候发生异常,执行setAccessible(true)方法"); 50 field.setAccessible(true); 51 isTurn=true; 52 } 53 } 54 } 55 } 56 }
1 public class FieldReflectTest { 2 public static void main(String[]args){ 3 FieldReflectDemo frd=new FieldReflectDemo(); 4 5 Field[] fields=FieldReflectDemo.class.getDeclaredFields(); 6 for(Field field:fields){ 7 8 System.out.println("字段名字是"+field.getName()); 9 Class fieldType = field.getType(); 10 System.out.println("类型为:"+field.getType()); 11 boolean isTurn=true; 12 while(isTurn){ 13 try{ 14 isTurn=false; 15 System.out.println("修改前的值为:"+ field.get(frd)); 16 if(fieldType.equals(int.class)) 17 { 18 System.out.println("利用setInt()方法修改成员变量的值."); 19 field.setInt(frd, 124); 20 } 21 else if(fieldType.equals(float.class)) 22 { 23 System.out.println("利用setFloat()方法修改成员变量的值."); 24 field.setFloat(frd, 9.9f); 25 }else if(fieldType.equals(boolean.class)) 26 { 27 System.out.println("利用setBoolean()方法修改成员变量的值."); 28 field.setBoolean(frd, false); 29 } 30 else 31 { 32 System.out.println("利用set()方法修改成员变量的值."); 33 field.set(frd, "NWQ"); 34 } 35 System.out.println("修改后的值为:"+field.get(frd)); 36 37 }catch(Exception e){ 38 System.out.println("在设置成员变量的时候发生异常,执行setAccessible(true)方法"); 39 field.setAccessible(true); 40 isTurn=true; 41 } 42 } 43 } 44 } 45 46 }
由上面两个类的测试结果可知.只有私有成员变量且在别的类里面调用时才需要将sccessible设置为true,取消Java语言访问检查