博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的反射中一些重要的方法
阅读量:6216 次
发布时间:2019-06-21

本文共 2488 字,大约阅读时间需要 8 分钟。

原理

  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  • Java中有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。Class对象十分特殊。他是Java中所有类的实例,借助它可以实现对一个对象的操作。

实例

1. 准备工作

  • 创建Person类

    public class Person {private String name;private String age;private void shot(){    System.out.println("!!!");}protected void shot1() {    System.out.println("111");}public String getAge() {    return age;}public String getName() {    return name;}public void setAge(String age) {    this.age = age;}public void setName(String name) {    this.name = name;}}

2. 创建Class对象

  • 通过getClass()

    Person person = new Person();Class
    class2 = person.getClass();
  • 通过Class.forName()

    Class
    class1 = Class.forName("test0118.testR.Person");
  • .class

    Class
    class3 = Person.class;

3. 对对象属性进行操作

  • 获取类的属性

    • getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.

    • getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

      Field[] fields = class1.getDeclaredFields();Field[] fields2 = class1.getFields();for (Field field : fields) {    System.out.println(Modifier.toString(field.getModifiers()) + field.getName());}for(Field field:fields2){    System.out.println(Modifier.toString(field.getModifiers())+field.getName());//由于Person类中并没有公有字段,所以该循环不输出任何值}/**输出:  privatenameprivateage*/
  • 获取类属性的修饰符

    上述代码中有一个方法Modifier.toString(field.getModifiers())即是获取该属性的修饰符,field.getModifiers()返回一个int值,将该值转化为对应的描述要用到Modifier.toString()方法。

  • 对类的属性进行操作

    Field field = class1.getField("name");Object object = class1.newInstance();field.setAccessible(true);//打破了封装的特性,允许对私有属性直接进行操作field.set(object, "123");System.out.println(field.get(object));
  • 获取类的方法

    • getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。

    • getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。

      Method[] methods = class1.getDeclaredMethods();Method[] methods2 = class1.getMethods();
  • 获取方法的参数和返回值的类型

    • method.getParameterTypes():获取方法参数类型,返回Class<?>数组

    • method.getReturnType():获取方法返回值类型,返回Class<?>对象

      Class
      [] ty = method.getParameterTypes();Class
      rty = method.getReturnType();
  • 使用反射调用方法

    • method.invoke(对象,参数...)

      Object object = class1.newInstance();Method method = class1.getMethod("setName", Class.forName("java.lang.String"));method.invoke(object, "123123");Method method2 = class1.getMethod("getName");System.out.println((String) method2.invoke(object));System.out.println(method.getReturnType());

转载地址:http://jnlja.baihongyu.com/

你可能感兴趣的文章
非常实用全面的 C++框架,库类等资源
查看>>
VS Code 常用插件
查看>>
kubectl top查看k8s pod的cpu , memory使用率情况
查看>>
fputs
查看>>
手写代码生成器
查看>>
SQL Server 维护计划备份主分区
查看>>
VS2008的安装,OpenCV2.1的安装,以及变量环境的设置
查看>>
Unable to install breakpoint in XXX due to missing line number attributes的解决
查看>>
分享SQL2005 查询表结构的SQL语句
查看>>
Android 手机如何防范吸费插件
查看>>
Copy-On-Write容器之二:CopyOnWriteArraySet
查看>>
ACCESS的分页之道,Access中实现row_number() over()聚合函数功能
查看>>
IOS成长之路-NSMutableURLRequest实现Post请求
查看>>
【Cocos2D-X 】初窥门径(9)播放音乐/音效
查看>>
HDU3930(离散对数与原根)
查看>>
茴香豆的第五种写法---设置ExpandableListView系统自带图标按下效果
查看>>
MSSQL Rebuild(重建)索引
查看>>
Linux_CentOS-服务器搭建 <七>
查看>>
转载:mysql如果数据不存在,则插入新数据,否则更新的实现方法
查看>>
<转>多线程中的lua同步问题
查看>>