温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中的反射机制是什么意思

发布时间:2021-11-20 13:44:02 来源:亿速云 阅读:111 作者:小新 栏目:编程语言

这篇文章给大家分享的是有关Java中的反射机制是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

  今天我们就来讲讲java的反射机制。

  当程序主动使用某个类的时候,如果该类还没有被加载到内存中,则系统会通过加载、连接、初始化这三个步骤对该类进行初始化,有时候会把这一整个流程叫做类加载器或类初始化

  类加载时值将类文件读入到内存中,并且为该类创建一个对象、之后可以直接通过对象来调用类及其实现的父类方法和属性

  一、反射机制到底是什么:类是由一组对象(拥有着共同属性)来组成的,而类与类之间也有共同的属性、构造方法、方法等结构,用来描述类的特性,即可以调用或查看某个类的属性、方法、即构造方法就叫做反射。

  二、java反射机制的好处:

  1.极大的提高了应用程序的扩展性,之前都是通过多来将子类对象传递给父类应用来实现的,大大的增加了代码的耦合性,并且无法访问真实对象的信息,这个时候就可以采取使用反射机制。

  2.当代码需要后期维护的时候,则需要修改很多地方,而通过反射机制,只需要直接修改一个地方即可。

  e.g Person person=new Student();

  三、应用场景:一般应用于底层框架的应用,不过大部分都已经封装好了的、以及可以实现工厂模式和代理模式等设计模式,同时也可以解决java泛型擦除等令人苦恼的问题

  一个类的组成:

  成员变量、成员方法、构造方法、修饰符、包等

  四、反射的组成:1.Class(类本身) 2.Field(属性) 3.Method(方法)

  接下来就直接进入代码阶段吧:

  一、获取类的三种方法:

  Person person = new Person();

  1.Class clazz = Person.class;//通过类来获取对象

  2.Class clazz = Class.forName("Reflect.Person");//通过类权限名(包名.类名)来获取Class对象

  //Class.forName会抛出异常,因为根据字符串来找到类,所以可能会出现找不到这样的类异常

  3.Class clazz = person.getClass();//通过类对象来调用

  二、自身类

  Class []interfaces = clazz.getInterfaces();//获取Person类里所有的接口

  String classname = clazz.getName();//获取类名字(包名.类名)

  String simpleName = clazz.getSimpleName(); //仅仅只是获得类名字,并没有包名

  int modifiers = clazz.getModifiers();//获取权限符是什么 返回值是int 1:public 2:private依次

  Package aPackage = clazz.getPackage();//获得包名

  Class superclass = clazz.getSuperclass();//获取该类的父类,有且只有一个

  Object o = clazz.newInstance();//生成类的实例对象,由于不知道要生成什么类的对象,而所有类的顶端都是Object的子类郑州哪家医院人流好 http://www.120csfkyy.com/

  三、属性(Filed)

  Field math = clazz.getField("math");//获得指定的name属性,有且只能找到public的属性

  Field[] fields = clazz.getFields();//获得所有的public的属性,以及父类

  Field id = clazz.getDeclaredField("id");//获得public 以及private、protected等指定(id)属性

  Field[] declaredFields = clazz.getDeclaredFields();//获得所有的属性以及父类

  当然找到属性能干嘛了,最重要的就是赋值啦。

  由于私有属性,除了本类以外的类都不可进行其访问,所以在设置值上面自然和public的不太一样

  public属性设值:

  Field name = clazz.getField("name");

  name.set(o,"TTL");//第一个属性是要设置值得属性属于哪个类实例化对象里面的,第二个参数则是要设置的值

  private属性设置:

  Field sex = clazz.getDeclaredField("sex");

  sex.setAccessible(true);//设置访问权限

  sex.set(person1,"女");

  四、方法

  Method setAddress = clazz.getMethod("Address", String.class);

  //第一个参数为要找方法的名字,第二个参数则是要找方法的形参是什么类型的

  Object address = setAddress.invoke(person1, "苏州");

  //第一个参数为类实例化的对象,第二个参数为参数要设置的值

  //执行方法

  五、构造方法

  Constructor constructor = clazz.getConstructor(String.class, String.class);

  //由于构造方法和类名一样,这里就不需要在此写类名对象了,只需写参数即可匹配到对应的构造方法

  constructor.newInstance("TTL","四川");//执行构造方法

感谢各位的阅读!关于“Java中的反射机制是什么意思”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI