反射的概念以及获取方法(一)

来源:互联网 发布:php垃圾回收机制 编辑:程序博客网 时间:2024/06/07 03:05

作者:叁念


反射的概念以及运用


声明:本文章所用代码结构如图所示,如果调试不成功,请按图片部署您的代码

这里写图片描述
其中Student类的代码如下:

package com.sannian;public class Student {    // 四个属性:两个公开,一个私有,一个静态    public String name;    public int age;    private int money;    public static int sint;    // 公开 无参    public void introduce() {        System.out.println("我是 " + name + ",今年" + age + "岁了");    }    // 公开 一参    public void say(String str) {        System.out.println(str);    }    // 公开 二参    public static int add(int num1, int num2) {        return num1 + num2;    }    // 私有 无参    private void play() {        System.out.println(name + "在玩游戏");    }    public Student() {        super();    }    public Student(String name) {        super();        this.name = name;    }    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Student [name=" + name + ", age=" + age + ", money=" + money + "]";    }}

1.反射( reflect)的一些概念

反射指的是程序在运行时能够动态的获取任何类的所有信息

java的反射机制主要提供了以下功能:
1. 在运行时判断任意一个对象所属的类
2. 在运行时构造任意一个类的对象
3. 在运行时判断任意一个类锁具有的成员属性和方法
4. 在运行时调用任意一个对象的方法

举个例子: 1,2,3,4,5  - Integer 类型 "a","b","c","d"    - String 类型 Integer, String    - Class类型

2.反射的优缺点

// 优点: 1. 降低程序的耦合性,提高自适应能力 2. 提高了程序的灵活性和拓展性 3. 允许程序创建和控制任意类型的对象,无需提前硬编码 //缺点: 1. 反射会模型程序的内部逻辑, 程序员更希望在代码中直接看出程序的逻辑,反射绕过了源代码,可能会带来维护性问题 代码比直接对应的代码复杂许多 2. 性能问题,反射其实是一种解释型操作 用于字段和方法的介入时,要远远慢于使用直接的代码 因此反射主要用在对灵活度要求非常高的框架 普通程序不建议使用反射

3.Class类型 - 类的类型

获取类型对象
1. Class.forName(完整类名)
2. 类名.class
3. 对象.getClass()

常用方法

  getName() //获取完整类名  getSimpleName() //获取简单类名  getDeclaredFields() //获取类中所有属性  getDeclaredMethods() //获取类中所有方法  getDeclaredConstructors() //获取类中所有构造器  newInstance() //实例化类的对象(公开的无参构造)

实际运用:

public class Demo {    public static void main(String[] args) {        /*********************  获取Class对象   ***********************/        /**1.通过类访问*/        Class<?> c1 = Student.class;        System.out.println(c1);        /**2.通过对象访问*/        Student stu = new Student();        Class<?> c2 = stu.getClass();            //true        System.out.println(c1 == c2);         /**通过完整类名访问*/        try {            Class<?> c3 = Class.forName("com.sannian.Student");            //true            System.out.println(c1 == c3);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }}

输出结果:

这里写图片描述


4.Field类型 - 属性的类型

 常用方法  getName() 获得属性名  getType() 获得属性的类型  get(Object obj) 获取obj对象中的这个属性的值  set(Object obj, Object value) 将obj对象中这个属性的值设置为value  setAccessible(true) 允许访问

实际运用:

public class Demo {    public static void main(String[] args) {    /*******************  获取字段  *************************/        /**getFields()访问所有字段*/        Class<?> c = Student.class;        Field[] fields = c.getFields();        /**打印 : 修饰符 类型 变量名*/        for (int i = 0; i < fields.length; i++) {            System.out.println(Modifier.toString(fields[i].getModifiers()) + " "+ fields[i].getType().getSimpleName() + " " + fields[i].getName());        }        /**打印结果:*/        //      public String name        //      public int age        //      public static int sint        System.out.println("===============================");        /**和getFields()的区别?*/        Field[] fields2 = c.getDeclaredFields();        for (int i = 0; i < fields2.length; i++) {            System.out.println(Modifier.toString(fields2[i].getModifiers()) + " "+ fields2[i].getType().getSimpleName() + " " + fields2[i].getName());        }        /**打印结果:*/        //      public String name        //      public int age        //      private int money  //其中私有的也能访问到        //      public static int sint    }}

输出结果:

这里写图片描述


5.Method类型 - 方法的类型

 常用方法  getName() 获取方法名称  getReturnType() 获取返回值类型  invoke(Object obj, Object... args) 调用obj对象的这个方法,参数列表为args  getTypeParameters() 获取参数列表

实际运用:

public class Demo {    public static void main(String[] args) {    /*******************  获取方法  *************************/        Class<?> c4 = Student.class;        Method[] methods = c4.getDeclaredMethods();        for (int i = 0; i < methods.length; i++) {            /**访问修饰符*/            String modi = Modifier.toString(methods[i].getModifiers());            /**返回值*/            String returnType = methods[i].getReturnType().getSimpleName();            /**方法名*/            String mName = methods[i].getName();            /**参数列表*/            String list = "(";            Class<?>[] parameterTypes = methods[i].getParameterTypes();            for (int j = 0; j < parameterTypes.length; j++) {                list += parameterTypes[j].getSimpleName();                if(j < parameterTypes.length - 1) {                    list += ",";                }            }            list += ")";            System.out.println(modi + " " + returnType + " " + mName + " " + list);        }//      public static int add (int,int)//      public void introduce ()//      public void say (String)//      private void play ()        }}

输出结果:

这里写图片描述

原创粉丝点击