• 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语言访问检查

  • 相关阅读:
    对协程的一些理解
    JUC中Lock和ReentrantLock介绍及源码解析
    JUC中AQS简介
    Executor框架简介
    CyclicBarrier简介
    CountDownLatch简介
    Semaphore简介
    ThreadPoolExecutor简介
    AtomicInteger简介
    synchronized和volatile简介
  • 原文地址:https://www.cnblogs.com/javahuang/p/2947925.html
Copyright © 2020-2023  润新知