专栏首页Golang开发Java基础——反射

Java基础——反射

反射机制

将类的各个组成部分封装成其他对象,称作反射机制,反射被称作是框架设计的灵魂。

class

Java除了基本类型其他都是class,包括interface,String,Object Runnable,Exception class的本质是数据类型Type 无继承关系的数据类型无法赋值 class/insterface的数据类型是class 每加载一个class,JVM就为其创建一个Class类型的实例,并关联起来 JVM持有的每个Class实例都指向一个数据类型 一个Clas实例包含

获取字节码Class对象

同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,无论通过哪一种方式获取的Class对象都是同一个。 1.Class.forName("全类名"):将字节码加载到内存,返回Class对象,主要用于配置文件,将类名定义在配置文件中,读取文件,加载类

Class c = Class.forName("domain.Person");

2 类名.class 通过类名的属性class获取,主要用于参数传递

Class c = Person.class;

3对象.getClass(): getClass()方法在object类中定义 ,主要用于对象获取字节码的方法。

            Person p = new Person();
            Class c = p.getClass();

获取Class方法

getName()// 获取全类名
getSimpleName()
getPackage()

获取成员变量

通过Class实例获取字段field信息:

getField(name):获取某个public的field(包括父类) 
getDeclaredField(name):获取当前类的某个field(不包括父类) 
getFields():获取所有public的field(包括父类) 
getDeclaredFields():获取当前类的所有field(不包括父类)

getFields 只能获取public的方法

            Class c = Person.class;
            Field[] fields = c.getFields();
            for (Field f :fields){
                System.out.println(f);
            }

getDeclaredFields()可以获取所有的成员变量 修饰符对其不影响。

            Class c = Person.class;
            Field[] fields = c.getDeclaredFields();
            for(Field f :fields){
                System.out.println(f);
            }

Field对象包含一个field的所有信息:

getName() 
getType() 
getModifiers() // 获取修饰符

获取和设置field的值:

get(Object obj)// 获取一个实例对象的该字段的值
set(Object, Object)// 设置一个实例对象的该字段的值
            Person p = new Person();
            p.setGender("male");
            Field f = Person.class.getField("gender");
            Object value = f.get(p);
            System.out.println(value);
            f.set(p,"female");
            System.out.println(p.getGender());

对私有变量的修改,暴力反射setAccessible(true)

            Person p = new Person();
            p.setName("xiaoming");
            Field f = Person.class.getDeclaredField("name");
            f.setAccessible(true);
            Object value = f.get(p);
            System.out.println(value);
            f.set(p,"xiaowang");
            System.out.println(p.getName());

Constructor构造方法

Constructor<?> [] getConstructor()
Constructor<T> getConstructor(类<?>... parameterTypes)

构造函数创建对象newInstance

            Constructor constructor = Person.class.getConstructor(String.class,int.class);
            Object p = constructor.newInstance("xiaoming",20);

空参数构造可以使用class方法newInstance

Methord成员方法

Methods []getMethods // 获取所有的public成员方法(包括父类方法)
Method getMethod(String name,类<?>...parameterTypes)
 Method[] getDeclaredMethods()
 Method[] methods = Person.class.getDeclaredMethods();

获取方法赋值invoke

            Method setName = Person.class.getMethod("setName",String.class);
            Person p = new Person();
            setName.invoke(p,"xiaoming");

获取成员方法名称

            Method[] methods = Person.class.getMethods();
            for(Method m :methods){
                System.out.println(m.getName());
            }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS运行时(4)——常用函数

    羊羽shine
  • Golang包——pprof

    pprof 是用于可视化和分析性能分析数据的工具 CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,...

    羊羽shine
  • Springboot——helloWorld

    创建SpringBootApplication @SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是Sp...

    羊羽shine
  • Java设计模式学习笔记—过滤器模式

    文章最后“Java设计模式笔记示例代码整合”为本系列代码整合,所有代码均为个人手打并运行测试,不定期更新。本节内容位于其Filter包(package)中。

    汐楓
  • 设计模式学习 - 单例模式

    两种模式都需要先私有化构造函数以禁止直接new操作来创建实例,不然就失去了单例的意义。

    许杨淼淼
  • Java单体应用 - 架构模式 - 03.设计模式-08.过滤器模式

    原文地址:http://www.work100.net/training/monolithic-architecture-design-patterns-fil...

    光束云
  • 过滤器模式过滤器模式

    过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻...

    用户2436820
  • 来玩Play框架05 数据库

    数据库是整个站点的数据储藏室。用户提交的数据可以存储在数据库中,以便未来使用。Play可以通过JDBC和数据库通信。我讲介绍Play和mysql数据库的连接。 ...

    Vamei
  • 软件测试中的测试文档

    测试文档是在软件测试之前或期间创建的工件的文档。它可以帮助测试团队估计所需的测试工作,测试覆盖范围,资源跟踪,执行进度等。它是一整套文档,可让您描述和记录测试计...

    归根落叶
  • c++面向对象的一些问题1.0

    构造函数 特殊的成员函数,给对象的初始化,不需要用户调用,建立对象时,自动执行 它的函数名字与类相同,可以重载,没有返回值和函数类型。 如果不写构造函...

    东风冷雪

扫码关注云+社区

领取腾讯云代金券