全文内容

1: 获取字节码文件对象的三种方式
2: 获取公有,私有方法,并调用构造方法,成员方法
3: 获取并调用私有成员变量
4: 如何为实例对象的成员变量赋值
5: 文末有一些注意

tea1类代码

class tea1{
private String i;
public int j;
public tea1(){}
public tea1(int j){
this.j = j;
}
private tea1(String i,int j){
this.j = j;
this.i = i;
} @Override
public String toString() {
return "tea1{" +
"i='" + i + '\'' +
", j=" + j +
'}';
}
private void q(){
System.out.println("调用私有成员方法");
}
}

测试类代码

package 学习.反射;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class a {
public static void main(String[] args) throws
ClassNotFoundException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException,
InstantiationException, NoSuchFieldException {
//获取字节码文件对象的三种方式
//一(推荐):foeName()里面是类所在的全路径
//idea可以右键所在类,然后点击copy,然后点击copy reference,行了
Class<?> tea1 = Class.forName("学习.反射.tea1");
//二:通过类对象获取字节码文件对象
tea1 tea11 = new tea1();
Class<?> aClass = tea11.getClass();
//三:通过类名获取字节码文件对象
Class<?> aClass1 = tea1.getClass();
/*
提前补充:
tea1.getConstructor(),这里面的参数是字节码文件对象
举例
Constructor<?> constructor1 = tea1.getConstructor(int.class);
这句意思是:返回了tea1类中的带有一个int参数的构造器,这个构造方法
默认是公有的,私有下面会讲.
举例:Constructor<?> constructor2
=tea1.getConstructor(int.class,String.class);
意思是获取带有两个参数的构造器int与String.
相信大家可以触类旁通
*/
//获取无参构造器
Constructor<?> constructor = tea1.getConstructor();
//获取有参构造器
Constructor<?> constructor1 = tea1.getConstructor(int.class);
/*
在不使用反射机制时,私有的构造方法是在外部无法调用的,拓展一下:比
如饿汉式,懒汉式设计模式,这两种设计模式就是将构造方法私有化了,
可以自己去了解以下,也可以等我更新文章。
Constructor<?> declaredConstructor =
tea1.getDeclaredConstructor(String.class, int.class);
declaredConstructor.setAccessible(true);
第一句是获取了一个私有的构造器对象,不过这个对象有锁
第二句就是破除锁。
*/
//获取私有构造器
Constructor<?> declaredConstructor =
tea1.getDeclaredConstructor(String.class, int.class);
//破除私有
/*
* 可以理解为公有方法在第一步找到对象就可以直接使用,而私有需要打开
* 私有锁,
* setAccessible就是打开锁
* */
declaredConstructor.setAccessible(true);
/*
可以在创建对象的时候传递参数,这个参数数量与类型要与
上边的tea1.getConstructor(int.class)相照应,否则有些运行时会出错
在这是使用上边获得的构造器来创建对象的过程
为了方便大家查看,我把上边代码贴过来了,可以一一对照
*/
//创建对象
//无参
//Constructor<?> constructor = tea1.getConstructor();
Object o = constructor.newInstance();
//有参
// Constructor<?> constructor1 = tea1.getConstructor(int.class);
Object o1 = constructor1.newInstance(1);
/*Constructor<?> declaredConstructor =
tea1.getDeclaredConstructor(String.class, int.class); */
Object a = declaredConstructor.newInstance("a", 1);
//获取方法
//这是获取公有方法,tea1.getMethod("toString")其中toString是类中 的方法名
Method toString = tea1.getMethod("toString");
//这是获取私有方法
Method declaredMethod = tea1.getDeclaredMethod("q");
//破除私有,
declaredMethod.setAccessible(true);
//下面是调用方法
//结构式:方法对象.invoke(实例对象)
//反射,反着写(狗头)
declaredMethod.invoke(o);
//输出3个结果
//使用反射机制调用方法
System.out.println(toString.invoke(o));
//直接输出就是默认调用toString
System.out.println(o1);
System.out.println(toString.invoke(a));
//获取成员变量
//获取公有变量
Field j = tea1.getField("j");
//输出a实例对象的j成员变量
System.out.println(j.get(a));
//私有成员变量
Field i = tea1.getDeclaredField("i");
//破除私有
i.setAccessible(true);
//输出a实例对象的成员变量
//结构:变量对象名.get(实例对象名)
//反射,反着写(狗头)
System.out.println(i.get(a));
//至此,获取构造方法的内容结束
//获取成员变量 //现在,获取实例对象,方法,变量都讲完了
//讲解如何为实例对象的成员变量进行赋值
//不知道大家现在能否看懂
//获取私有成员变量
Field j1 = tea1.getDeclaredField("j");
//破除私有变量
j1.setAccessible(true);
//为成员变量赋值
//j1是成员变量的实例化对象
//o是上文创建的一个对象,我把代码粘贴过来了
//Constructor<?> constructor = tea1.getConstructor();
//Object o = constructor.newInstance();
//结构:成员变量的实例化对象.set(类的实例化对象,对应的成员变量的值)
//400是int,原因是:
//Field j1 = tea1.getDeclaredField("j");
//而j在类中是int类型,一定要类型对应
j1.set(o,400);
//获取并输出o对象的成员变量j的值
System.out.println(j1.get(o));
}
}

注意:可以按照获得私有构造器,私有方法,私有对象的函数处理公有方法,这样不会在一些未知的情况下出错。
推荐大家都使用Class.forName()来获取字节码文件对象。
谢谢大家。

Java反射(重要)的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  4. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  5. java基础知识(十一)java反射机制(下)

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

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射 之 反射基础

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

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  10. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

随机推荐

  1. 【C++ 字符串题目】 输入三个人名,按字母顺序排序输出

    题目来源:https://acm.ujn.edu.cn Problem A: [C++ 字符串] 输入三个人名,按字母顺序排序输出 Time Limit: 1 Sec  Memory Limit: 1 ...

  2. Gitee整改之思考

    本文主要内容如下: 1.Gitee是什么? 2.Gitee与Github的区别有哪些? 3.为什么要使用Gitee? 4.Gitee的商业模式是怎样的? 5.Gitee为何会被整改? 6.Gitee这 ...

  3. 文件输入输出处理-File

    大佬的理解-><IO流和File> 1.File类 File类是IO包中唯一代表磁盘文件本身的对象,File类定义了一些与平台无关的方法来操作文件.通过调用File类提供的各种方法, ...

  4. CentOS中实现基于Docker部署BI数据分析

    作为一个专业小白,咱啥都不懂. linux不懂,docker不懂. 但是我还想要完成领导下达的任务:在linux中安装docker后部署数据可视化工具.作为一名敬业 的打工人摆烂不可以,躺平不可以,弱 ...

  5. 【python基础】第05回 数据类型,交互,格式化输出,运算符

    上节内容回顾 1.python的注释 # 单行注释 pycharm快捷键:ctrl+? '''多行注释''' """多行注释""" 2.py ...

  6. SpringBoot项目集成Swagger启动报错: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is

    使用的Swagger版本是2.9.2.knife4j版本是2.0.4. SpringBoot 版本是2.6.2将SpringBoot版本回退到2.5.6就可以正常启动

  7. CMU15445 (Fall 2019) 之 Project#3 - Query Execution 详解

    前言 经过前面两个实验的铺垫,终于到了给数据库系统添加执行查询计划功能的时候了.给定一条 SQL 语句,我们可以将其中的操作符组织为一棵树,树中的每一个父节点都能从子节点获取 tuple 并处理成操作 ...

  8. MIT 6.824 Llab2B Raft之日志复制

    书接上文Raft Part A | MIT 6.824 Lab2A Leader Election. 实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021 ...

  9. HTTPS 如何保证数据传输安全

    引言 为什么把这个作为选题. 大概也是2年前,我的同事,在面试某宇宙大厂遇到的问题与我一起探讨.这个时候我发现,虽然TLS(https)这个东西大部分时候可能不会被直接用到,但很容易被作为考察的目标范 ...

  10. 我的sql没问题为什么还是这么慢|MySQL加锁规则

    前言 前阵子参与了字节跳动后端青训营,其中大项目编写涉及到数据持久化一般选择使用MySQL.由于时间原因,数据库使用我选择了无脑三板斧:1. 建立了索引加速查询.2. 关闭自动提交事务.3. 在需要确 ...