java 反射

Posted bigfirecloud

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 反射相关的知识,希望对你有一定的参考价值。

java反射概念

  在java运行时环境,对于任意一个类,能够获取它的属性和方法,对于任意一个对象,能够获取调用它的方法和属性,这种动态获取类的信息以及动态调用对象的方法的功能称为java反射机制。

java反射机制主要提供了以下功能:

  1. 在运行时判断任意一个对象所属的类;
  2. 在运行时构造任意一个类的对象;
  3. 在运行时获取任意一个类所具有的属性和方法;
  4. 在运行时调用任意一个对象的方法;

 

java反射的作用

  java反射最大的作用就是开发各种通用框架,spring就是最典型的例子;利用反射,我们可以通过配置文件来动态加载配置和加载类;


 

java反射常用类

java.lang.class: 类对象
java.lang.reflect.Contructor: 类的构造器
java.lang.reflect.Field:   类的成员变量(属性)
java.lang.reflect.Method: 类的方法

 

 

常用的一些方法

  • 测试用的bean
  •  1 package test.reflect;
     2 
     3 public class Hero 
     4 
     5     private String name;   //名称
     6     private Integer age;   //年龄
     7     private Float blood;   //血量
     8     private Float mana;    //蓝量
     9     private double speed;   //速度
    10     
    11     private String sayHello(String name,Integer age) 
    12         System.out.println("Hello,my name is " + name + ",I am " + age + " years old.");
    13         return name;
    14     
    15     public Hero() 
    16         this.name = "Logan";
    17     
    18     public Hero(String name,Integer age) 
    19         this.name = name;
    20         this.age = age;
    21     
    22     public String getName() 
    23         return name;
    24     
    25     public void setName(String name) 
    26         this.name = name;
    27     
    28     public Integer getAge() 
    29         return age;
    30     
    31     public void setAge(Integer age) 
    32         this.age = age;
    33     
    34     public Float getBlood() 
    35         return blood;
    36     
    37     public void setBlood(Float blood) 
    38         this.blood = blood;
    39     
    40     public Float getMana() 
    41         return mana;
    42     
    43     public void setMana(Float mana) 
    44         this.mana = mana;
    45     
    46     public double getSpeed() 
    47         return speed;
    48     
    49     public void setSpeed(double speed) 
    50         this.speed = speed;
    51     
    52 

     

  • 常用方法介绍和测试
  •  1     try 
     2         Hero hero = new Hero();
     3         //获取class对象
     4         Class class1 = hero.getClass();
     5         Class class2 = Hero.class;
     6         Class class3 = Class.forName("test.reflect.Hero");
     7         System.out.println(class1 == class2);    //true
     8         System.out.println(class1 == class3);    //true
     9         
    10         //创建实例
    11         Object instance1 = class1.newInstance();    //通过class对象创建
    12         Constructor constructor = class1.getConstructor();  //通过构造器创建
    13         Object instance2 = constructor.newInstance();
    14         
    15         //获取类的所有成员变量
    16         Field[] fields = class1.getDeclaredFields();
    17         Float x = 0f;
    18         for(int i=0; i<fields.length; i++)
    19             Field field = fields[i];
    20             field.setAccessible(true);    //设置该field访问权限,否则private修饰的字段无法访问
    21             Type type = field.getGenericType();  //变量类型
    22             if("java.lang.String".equalse(type.getTypeName()))
    23                 field.set(instance1,"mogan");   //给instance1对象的该字段赋值,相当于set方法
    24                 String value = (String)field.get(instance1); //获取值,相当于get方法
    25                 System.out.println(field.getName() + " = " + value);
    26             
    27             if("java.lang.Integer".equalse(type.getTypeName()))
    28                 field.set(instance1,i);
    29                 Integer value = (Integer)field.get(instance1);
    30                 System.out.println(field.getName() + " = " + value);
    31             
    32             if("java.lang.Float".equalse(type.getTypeName()))
    33                 field.set(instance1,x);
    34                 Float value = (Float)field.get(instance1);
    35                 x++;
    36                 System.out.println(field.getName() + " = " + value);
    37             
    38             if("double".equals(type.getTypeName())) 
    39                 field.set(instance1, 99.0);
    40                 double value = (Double)field.get(instance1);
    41                 System.out.println(field.getName() +" = " + value);
    42         
    43         
    44         
    45         //根据变量名称获取类的某个成员变量
    46         Field field = class1.getFiled("name");
    47         field.setAccessible(true);
    48         field.set(instance1,"Logen");
    49         Object object = field.get(instance1);
    50         System.out.println(object);
    51         
    52         //获取该类的所有方法
    53         Method[] methods = class1.getDeclaredMethods();
    54         for(int i = 0; i < methods.lenth; i++)
    55             Method method = methods[i];
    56             String methodName = method.getName();  //方法名
    57             System.out.printlin(methodName);
    58             
    59             Class<?> returnType = method.getReturnType();  //方法返回值类型
    60             String typeName = returnType.getName();
    61             System.out.println(typeName);
    62             
    63             int count = method.getParametercount();     //参数个数
    64             Parameter parameters = method.getParameters();  //参数
    65             Class<?>[] parameterTypes = method.getParameterType();  //参数类型
    66         
    67         
    68         //根据方法名称和参数类型获得具体的方法
    69         Method sayHello = class1.getDeclaredMethod("sayHello",String.class,Integer.class);
    70         sayHello.setAccessible(true);   //获取访问权限
    71         sayHello.invoke(instance1,"Logen",200);  //执行方法
    72      catch (ClassNotFoundException e) 
    73         e.printStackTrace();
    74     

     


 

Class的 getDeclaredXXX和getXXX的区别:

getDeclaredXXX():得到类本身的属性或方法,不能获取继承于父类的属性和方法,可以获取到private,default,procted,public修饰的属性或方法;

getXXX():得到类本身和继承于父类的属性或方法,只能获取public修饰的属性或方法。

 

以上是关于java 反射的主要内容,如果未能解决你的问题,请参考以下文章

Java Reflection (JAVA反射)机制详解

说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题?

反射机制在java中如何做呀?

如何利用java的反射机制动态创建对象

Java反射详解:入门+使用+原理+应用场景

Java反射之剖析方法