java class和reflect

类名.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 语言访问检查。

FieldReflectDemo
 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 }
FieldReflectTest
 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语言访问检查

原文地址:https://www.cnblogs.com/javahuang/p/2947925.html