Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法

获取Class对象的三种方式

  • Object类中的getClass()方法

    想要用这种方式,必须要明确具体的类,并创建对象
Person p = new Person();
Class clazz = p.getClass();
  • 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象

    相对简单,但是还是要明确用到类中的静态成员
Class clazz = Person.class;
  • 通过给定的类的字符串名称就获取该类,该方法就是forName
String className = "com.abc.Person"; //此处为class的全称
Class clazz = Class.forName(className);

获取构造函数

  • 无参构造函数
String name = "com.abc.Person";
Class clazz = Class.forName(name);
Object obj = clazz.newInstance();
  • 有参构造函数

    获取到该构造函数:getConstructor(paramterTypes);
String name = "com.abc.Person";
Class clazz = Class.forName(name);
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("test", 10);

获取字段

公有

Class clazz = Class.forName("com.abc.Person");
Field field = clazz.getField("age"); //只能获取公有的
Object o = field.get(obj);
System.out.println(o);

私有

Class clazz = Class.forName("com.abc.Person");
Field field = clazz.getDeclaredField("age"); //只获取本类,但包含私有
//对私有字段的访问取消权限检查,暴力访问
field.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj, 20);
Object o = field.get(obj);
System.out.println(o);

获取方法

  • 获取所有方法
Class clazz = Class.forName("com.abc.Person");
Method[] methods = clazz.getMethods(); //获取的都是公有的方法。
//methods = clazz.getDeclaredMethods(); //只获取本类中所有方法,包含私有
for(Method method : methods){
System.out.println(method);
}
  • 调用无参方法
Class clazz = Class.forName("com.abc.Person");
Method method = clazz.getMethod("show", null); //获取空参数一般方法。
//Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("name", 10);
method.invoke(obj, null);
  • 调用有参方法
Class clazz = Class.forName("com.abc.Person");
Method method = clazz.getMethod("show", String.class, int.class);
Object obj = clazz.newInstance();
method.invoke(obj, "name", 20);

Java学习笔记-反射机制的更多相关文章

  1. JAVA 学习笔记 - 反射机制

    1.   JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...

  2. java学习之反射机制

    java语言区别于C,C++等准静态语言的最大特点就是java的反射机制.静态语言的最直接定义就是不能在运行时改变程序结构或变量的类型.按照这样的定义,python,ruby是动态语言,C,C++,J ...

  3. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  4. java学习--Reflection反射机制

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

  5. Java学习:反射机制简介

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

  6. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  7. Java学习笔记--反射

    什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...

  8. Java 学习之反射机制“解刨”分解类,并获取内容!

    正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了).下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看. 原理分析: 所谓反射就是将一个类当做我们研究的对 ...

  9. Java学习笔记--反射API

    反射API 1.反射API的介绍 通过反射API可以获取Java程序在运行时刻的内部结构.比如Java类中包含的构造方法.域和方法等元素,并可以与这些元素进行交换.     按照 一般地面向对象的设计 ...

随机推荐

  1. composer查看全局配置

    composer config -l -g composer 更新慢 composer下载不下来问题解决 使用 Composer 镜像加速有两种选项: 选项一:全局配置,这样所有项目都能惠及(推荐): ...

  2. 最大的矩形(CCF)

    问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...

  3. 'telnet' is not recognized as an internal or external command

     http://blog.csdn.net/lubinsu/article/details/7294870 使用telnet的时候出现如下提示:'telnet' is not recognized ...

  4. 2019 南昌ICPC网络赛H The Nth Item

    The Nth Iteam 题意:F(0)=1,F(1)=1,F(n)=3*F(n-1)+2*F(n-2) (n>=2) ,F(n) mod 998244353.给出Q跟N1,Ni=Ni-1^( ...

  5. 修改Ubuntu国内镜像

    打开软件和更新:如下图 选择一个自己喜欢的镜像. 然后执行  sudo apt-get update    更新源. 结束 1.原文件备份 sudo cp /etc/apt/sources.list ...

  6. 【CUDA 基础】6.5 流回调

    title: [CUDA 基础]6.5 流回调 categories: - CUDA - Freshman tags: - 流回调 toc: true date: 2018-06-20 21:56:1 ...

  7. ubuntu16.0.4 设置静态ip地址

    由于Ubuntu重启之后,ip很容易改变,可以用以下方式固定ip地址 1.设置ip地址 vi /etc/network/interface # The loopback network interfa ...

  8. array_column()用法

    <?php $arr = [ [ 'id' => 1, 'name' => 'a' ],[ 'id' => 2, 'name' => 'b', ], [ 'id' =&g ...

  9. Qt 字符串QString arg()用法总结

    1.QString::arg()//用字符串变量参数依次替代字符串中最小数值 QString i = "iTest";           // current file's nu ...

  10. 使用 Jenkins 发布 web 应用至 Tomcat

    Jenkins 的安装:https://www.cnblogs.com/jhxxb/p/11406805.html 发布流程:Git -> Maven -> Tomcat 一.基本环境 G ...