Java 反射简单入门

Java反射介绍

Java反射的作用

在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。 对于任意一个对

象,可以调用它的任意一个方法。 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。

反射结构分析

Java反射原理:将普通java类的各个组成部分分别封装为对象,包括类的成员变量、成员方法、成员构造

其所对应的对象分别是:Field、Method、Constructor

如何获取各个部分? 通过类的字节码对象,即Class对象获取

Class类将所有的普通java类作为对象。

获取Class对象

Java代码在计算机中的三个阶段

三个阶段获取Class对象的方法

  1. Class.forName(“全类名”)

    将字节码文件加载进内存,并返回class对象。多用于配置文件

  2. 类名.class

    通过类名的class属性获取,该方法常用于参数的传递

  3. 对象名.getClass()

    getClass()方法定义于Object类中,用于对象获取字节码。

同一个字节码文件(*.class)在程序运行过程中,只会被加载一次。无论通过哪种方法获取的class对象都是同一个。

Class对象中的常用方法

获取成员变量

方法名 作用
Field[] getFields() 获取所有public修饰的成员变量
Field getField(String name) 获取指定名称的 public修饰的成员变量
Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name) 获取指定名称的成员变量,不考虑修饰符
Field类的常用方法
方法名 作用
void set(Object obj, Object value) 设置值,将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
Object get(Object obj) 获取值,返回指定对象上此 Field 表示的字段的值
setAccessible(true) 忽略访问权限修饰符的安全检查

当访问私有变量时,必须设置setAccessible(true)来忽略访问权限修饰符的安全检查,否则没有权限访问。

代码示例
package com.zrm.reflect;
/**
* @author Randolfz
* @date:2020年2月3日
*/
public class Student {
private String name;
protected int age;
public String hobby;
//getter and setter
//toString()
} package com.zrm.reflect;
import java.lang.reflect.Field;
/**
* @author Randolfz
* @date:2020年2月3日
*/
public class TestReflect {
public static void main(String[] args) throws Exception{
Class cls = Student.class;
Field[] fields = cls.getDeclaredFields();
//Field[] fields = cls.getFields();
for (Field field : fields) {
System.out.println(field);
}
/*********************************/
Field h = cls.getField("hobby");
Student s = new Student();
h.set(s, "打羽毛球");
System.out.println(s);
Field n = cls.getDeclaredField("name");
n.setAccessible(true);
System.out.println(n.get(s));
}
}

获取构造方法

方法名 作用
Constructor<?>[] getConstructors() 返回此 Class 对象所表示的类的所有公共构造方法。
Constructor<T> getConstructor(类<?>... parameterTypes) 返回此 Class 对象所表示的类的指定参数公共构造方法。
Constructor<?>[] getDeclaredConstructors() 返回此 Class 对象所表示的类的所有构造方法,不考虑修饰符。
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) 返回此 Class 对象所表示的类的指定参数构造方法,不考虑修饰符。
Constructor类中的常用方法
方法名 作用
T newInstance(Object... initargs) 实例化一个对象

注: 如果使用空参数构造方法创建对象,则可以直接通过Class对象的newInstance方法来创建对象。

代码示例
//向Student类中填加两个构造方法
public Student(String name, int age, String hobby) {
super();
this.name = name;
this.age = age;
this.hobby = hobby;
} public Student() {
super();
} /**
*
*/
package com.zrm.reflect;
import java.lang.reflect.Constructor;
/**
* @author Randolfz
* @date:2020年2月3日
*/
public class TestReflect2 {
public static void main(String[] args) throws Exception{
Class cls = Student.class;
//方法一
Constructor c1 = cls.getConstructor(String.class,int.class,String.class);
Object s1 = c1.newInstance("帝释天",24,"看小说");
System.out.println(s1);
//方法二 调用空参构造
Constructor c2 = cls.getConstructor();
Object s2 = c2.newInstance();
System.out.println(s2);
//方法三 由Class对象直接创建
Object c3 = cls.newInstance();
System.out.println(c3);
}
}

获取成员方法

方法名 作用
Method[] getMethods() 获取所有public修饰的成员方法
Method getMethod(String name, 类<?>... parameterTypes) 获取指定参数形式的 public修饰的成员方法
Method[] getDeclaredMethods() 获取所有成员方法,不考虑修饰符
Method getDeclaredMethod(String name, 类<?>... parameterTypes) 获取指定参数形式的成员方法,不考虑修饰符
Method类中的常用方法
方法名 作用
Object invoke(Object obj, Object... args) 执行方法,对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
String getName 获取方法名
示例代码
//向Student类中添加如下方法
public void song() {
System.out.println("We are the word...");
}
public void song(String songs) {
System.out.println("我会唱"+songs);
} /**
*
*/
package com.zrm.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* @author Randolfz
* @date:2020年2月3日
*/
public class TestReflect3 {
public static void main(String[] args) throws Exception{
Class cls = Student.class;
Student stu = new Student();
//执行带参数方法
Method song1 = cls.getMethod("song", String.class);
song1.invoke(stu, "你确定这就是爱吗");
//执行无参数方法
Method song2 = cls.getMethod("song");
song2.invoke(stu);
//获取方法名
Method[] methods = cls.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}

这里列举的只是java反射中的常用操作,其他用法参照JDK说明文档。

Java 反射简单入门的更多相关文章

  1. 大白话说Java反射:入门、使用、原理

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java反射:入门.进阶.原理> 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时 ...

  2. Java反射-初步入门

    Java反射-初步入门 学反射先了解什么是反射. 百度百科:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动 ...

  3. 大白话说Java反射:入门、使用、原理 (转)

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java反射:入门.进阶.原理> 目录 一个简单的例子 反射常用API 获取反射中的Class对象 通过反射创建类对象 通过反射获取类 ...

  4. java反射机制入门01

    java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...

  5. java反射快速入门(二)

    上一遍博文 , 简单介绍java 反射的常用接口,本遍博文, 我会结合项目开发的实际例子讲解下 java反射的使用 现在有个需求, 要将一个对象转换成xml格式, 或者将一串xml转换一个对象, 这时 ...

  6. java反射快速入门(一)

    本文会从以下几个方面讲起 ① 反射的简单解释 ② java反射的API接口 及 demo ③ 反射的优缺点.应用场景 一.什么是反射? java反射:在程序运行中动态获取类的信息,及动态调用对象的方法 ...

  7. Java反射-简单应用

    为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 以下我将用一个开晚会的样例来演示一下,终于达到的效果是:工厂+反射+配置文件实现程序的灵活 ...

  8. 【Java基础】Java注解简单入门

    注解简单来说就是配置,是特别的配置,之前常用的配置文件,可以用注解替换.然后通过反射去获取注解的信息. 如何定义一个注解 你在IDE中新建一个注解定义,是这样的结构的: package com.nic ...

  9. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...

  10. Java反射 - 简单的给Bean赋值和取值

    由于项目的实际需要,所以利用java反射原理写了一个简单给bean赋值和取值通用的类,在此记录下方便自己日后用到,也为需要的兄弟提供个参考例子. 工具类BeanRefUtil:   package c ...

随机推荐

  1. 现代Web安全实践:基于Token与Refresh Token的单点登录(SSO)实现

    ​ 在数字化转型加速的今天,单点登录(SSO)已成为企业身份管理的核心基础设施.袋鼠云UED团队在过去几年中,为金融.政务.医疗等领域的大型系统构建SSO解决方案.本文将分享基于Token的标准SSO ...

  2. EasyMR6.2 全面解读:四大功能深度优化,解锁全新大数据处理和计算体验

    在刚刚过去的2024春季发布会上,袋鼠云带来了数栈产品V6.2版本的全新发布.其中,EasyMR 作为数栈V6.2中的一项关键能力,代表了袋鼠云对大数据生态的深入理解和持续创新. EasyMR(后文统 ...

  3. Web前端入门第 68 问:JavaScript 事件循环机制中的微任务与宏任务

    JS 是单线程语言.这句话对不对? 按照目前的情况来看,JS 自从支持了 Web Worker 之后,就不再是单线程语言了,但 Worker 的工作线程与主线程有区别,在 Worker 的工作线程中无 ...

  4. AI应用实战课学习总结(2)hello sk-learn

    大家好,我是Edison. 最近入坑黄佳老师的<AI应用实战课>,记录下我的学习之旅,也算是总结回顾. 今天是我们的第2站,了解下scikit-learn框架(简称sk-learn)及相关 ...

  5. pdf工具类之获取pdf的总页数以及每页的宽度和高度

    没啥可说的,毫无技术的水贴 1 /** 2 * 获取pdf的总页数以及每页的宽度和高度 3 * 4 * @param filePath 5 * @return Map<String, List& ...

  6. 《MySQL实战45讲》个人笔记-实战篇

    拜读了林晓斌大佬的<MySQL实战45讲>,特意做个知识点总结,以便后期回忆. 09.普通索引和唯一索引,应该怎么选择? 查询时:普通索引找到第一个后,还会往下找,直到碰到第一个不满足条件 ...

  7. leetcode 528 按权重随机选择

    简介 记住如何使用C++11函数的话会很简单. 参考链接 https://leetcode-cn.com/problems/random-pick-with-weight/solution/528-a ...

  8. 最简单的一个 STL格式的网格文件

    简介 最简单格式的一个STL格式的文件 文件内容 solid filenamestl facet normal 1 1 1 outer loop vertex 0 0 1 vertex 0 1 0 v ...

  9. 金山pdf 阅读 点击链接如何跳转回来

    简介 RT ALT + 左箭头

  10. 图论 I

    进军图论! 本篇图论主要内容:最短路.最小生成树. 定义与记号 涉及常见或可能用到的概念的定义.关于更多,见参考资料. 基本定义 图:一张图 \(G\) 由若干个点和连接这些点的边构成.点的集合称为 ...