码迷,mamicode.com
首页 > 编程语言 > 详细

java 反射

时间:2019-08-29 17:49:35      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:年龄   访问权限   gets   ESS   efault   ted   变量   tco   类对象   

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 反射

标签:年龄   访问权限   gets   ESS   efault   ted   变量   tco   类对象   

原文地址:https://www.cnblogs.com/bigfirecloud/p/11431042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!