反射的定义

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阅读 144评论 0 1
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 6,837评论 6 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 8,590评论 1 27
  • 才艺双全果敢有为的珊珊 【自我画像】 大家好!我叫黄珊珊,是一名就读于基立道小学六年级即将毕业的小学生,我今年12...
    力图说阅读 413评论 0 2
  • 曾经来过的地方早已不再熟悉 陌生的像离开二十年后的你 这尘世最动人的美丽 怪我 把双眼蒙蔽 沉睡在湖底 多么可笑的...
    肃默阅读 61评论 0 2