反射的定义

DATA(053)2019-03-20反射的定义-作用-Class类实例化

1:反射是Java进行自我管理 类、对象的一种机制

  • 怎么进行管理,管理的是什么?

  • 之前是不知道类里边有什么的,并不知道他里边的方法、属性等

  • 但是一旦通过反射 那么就知道了

  • 2:作用:通过反射机制发现对象的类型,如方法、属性、构造器等

  • 并且通过对象访问方法和属性等

  • 3:calss加载,就是把类文件加载到内存中,成为一个对象(实例化),class类的实例化

  • 基本数据类型

  • 引用数据类型


public static void main(String[] args) {

// 基本数据类型

        Class  cla01=int.class;

        //把整型的生成一个class文件

        System.out.println(cla01);  //  就是一个整型, 这就是它在实例化里加载的一个对象

        System.out.println("********************************");

        //引用数据类型  以下两种方法都是一样的,一个是直接调用class,一个调用class的方法

        Class cla02=String.class;

        System.out.println(cla02);

        System.out.println("************************************");

        try {

//forName是一个类加载器

            Class cla03=Class.forName("java.lang.String");

            System.out.println(cla03);

        }catch (ClassNotFoundException e) {

e.printStackTrace();

        }

//通过对象调用的这个方法加载进来的

        System.out.println("************************************");

        String string=new String("dddddd");

        Class cla04=string.getClass();

        System.out.println(cla04);

    }

}

运行效果:

int
********************************
class java.lang.String
************************************
class java.lang.String
************************************
class java.lang.String

通过反射提取class类对象的属性

//Class的实例化 把student这个文件放到内存里了
        Class<?> studentClass=Class.forName("com.neuedu.entity.Student");

        //提取出来的是多个文件,field[]
        Field[] fields = studentClass.getDeclaredFields();  //提取全部字段
                                    //getFields()此方法只显示公共的字段
        for (Field f:fields) {
            System.out.println(Modifier.toString(f.getModifiers())+" "+f.getType()+"  "+f.getName());  // 字段全都提取到了
            //getModifiers Field对象表示的对象 Java语言修饰符
        }

运行效果:

private int  id
 class java.lang.String  name
protected int  age
public class java.lang.String  address

通过反射实现方法的调用

// 1:实例化
      Class<?> studentclass=Class.forName("com.neuedu.entity.Student");

      // 2:提取方法
      /**
       * 第一个参数 方法名:
       * 从第二个开始的参数,也可能后面有第三个,第四个,第五个
       * 后面写你参数的那个class类
       */
      Method method= studentclass.getMethod("setName",String.class);

      // 3:执行方法
      /**
       * 执行通过invoke()这个方法
       * 第一个参数:Student的对象
       * 从第二个开始的参数:实际值
       */
      //这个对象怎么来呢?通过studentclass.newInstance();
      Object obj=studentclass.newInstance();
      method.invoke(obj,"tom");

      //以上为赋值,现在我得取出来用吧
      /**
       * 第一个参数 方法名:
       * 从第二个开始的参数的class类对象,无参的时候不用添加
       */
      Method methodget= studentclass.getMethod("getName");


      /**
       * 第一个参数:Student的对象
       * 从第二个开始的参数:实际值 不用添加
       */
      Object getReturn=methodget.invoke(obj);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 类加载 类加载负责加载编译后的class文件(字节码文件)到JVM当中。 在JRE中,类加载器主要分为以下几种:引...
    DrLester阅读 2,994评论 0 1
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,871评论 6 13
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,600评论 0 11
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,805评论 1 32
  • 整体Retrofit内容如下: 1、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李头阅读 10,117评论 2 12