美文网首页
反射的定义

反射的定义

作者: tnoyh | 来源:发表于2019-10-07 17:44 被阅读0次

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);

相关文章

网友评论

      本文标题:反射的定义

      本文链接:https://www.haomeiwen.com/subject/xyqzrctx.html