全文内容

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. 渗透测试之常用的sql语句

    学习路漫漫,常用的sql语句给我们平常所运用的sql语句相差不多,用句土话讲:百变不离其中 注:网络安全时刻警醒,需要打靶的还需要建立自己的靶场,关注博主在以往博客中分享有多种创建靶场可参考 1.判断 ...

  2. ExtJS 布局-Accordion布局(Accordion layout)

    更新记录: 2022年6月2日 开始. 2022年6月3日 发布. 1.说明 accordion(手风琴)布局一次仅显示一个子组件,内置支持 折叠 和 展开.当需要堆叠多个子组件,并每次只显示一次时, ...

  3. 一些好用的javascript/typescript方法封装分享

    1.数字格式化 JS版-直接写到原型链上 /** * @author: silencetea * @name: * @description: 数字格式化,默认每三位用英文逗号分隔 * @param ...

  4. 2.1 动为进程,静为程序 -进程概论 -《zobolの操作系统学习札记》

    2.1 动为进程,静为程序 -进程概论 目录 2.1 动为进程,静为程序 -进程概论 问1:发明进程的原因? 问2:现在计算机中的进程的定义是什么? 问3:为什么进程跟处理器的联系更密切? 问4:进程 ...

  5. SimpleMarkDown编辑器离线版以及桌面应用版上线

    之前,我们开发了Web版本SimpleMarkDown编辑器.今天,我们又推出了离线版和桌面应用版. 主要功能: 页面简约: 实时保存: 一键清空内容: 支持微信公众号.知乎.稀土掘金.CSDN等多个 ...

  6. sql-sql优化

    SQL执行流程 a. 编写过程: select dinstinct .. from .. join .. on .. where .. group by .. having .. order by . ...

  7. Java创建TXT文件并写入 内容

    public static void main(String[] args) { String filePath = "E:/" + "1.txt"; Stri ...

  8. 网络通讯之Socket-Tcp(一)

    网络通讯之Socket-Tcp  分成3部分讲解: 网络通讯之Socket-Tcp(一): 1.如何理解Socket 2.Socket通信重要函数 网络通讯之Socket-Tcp(二): 1.简单So ...

  9. Sentinel-流量防卫兵

    1.背景 1.1 简介 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性. Sentinel 具有以下特征 丰富的应用场景:Sentinel 承接了阿里巴 ...

  10. go 编程规范

    如果没有编程规范会有什么问题? 哪些地方可以需要指定规范? 非编码类规范:编码规范 非编码规范 开源规范 http://www.ruanyifeng.com/blog/2011/05/how_to_c ...