原来你是这样的JAVA[06]-反射
1.JVM为每个加载的class及interface创建了对应的Class实例来保存class及interface的所有信息;
获取一个class对应的Class实例后,就可以获取该class的所有信息;
通过Class实例获取class信息的方法称为反射(Reflection);
JVM总是动态加载class,可以在运行期根据条件来控制加载class。
2.Java的反射API主要用于在运行过程中动态生成类、接口或对象等信息,其常用API如下。
- Class类:用于获取类的属性、方法等信息。
- Field类:表示类的成员变量,用于获取和设置类中的属性值。
- Method类:表示类的方法,用于获取方法的描述信息或者执行某个方法。
- Constructor类:表示类的构造方法。
public class ReflectTest {
public static void main(String[] args) {
Class class1 = String.class;
printClassInfo(class1);
Class cls2 = "hello".getClass();
printClassInfo(cls2);
Class cls3 = String[].class;
printClassInfo(cls3);
//true,指向同一个实例
System.out.println("class1 == cls2? "+(class1 == cls2));
}
private static void printClassInfo(Class c) {
System.out.println("getName()=" + c.getName());
System.out.println("getSimpleName()=" + c.getSimpleName());
System.out.println("isInterface()=" + c.isInterface());
System.out.println("isEnum()=" + c.isEnum());
System.out.println("isArray()=" + c.isArray());
System.out.println("isPrimitive=" + c.isPrimitive());
}
}
3.Class类提供了以下几个方法来获取字段:
- Field getField(name):根据字段名获取某个public的field(包括父类)
- Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
- Field[] getFields():获取所有public的field(包括父类)
- Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
- Field.setAccessible:成员变量为private,必须进行此操作。
class Student extends Person {
public int score;
private int grade;
}
class Person {
public String name;
}
首先尝试访问共有和私有变量:
private static void method() throws NoSuchFieldException {
Class cls = Student.class;
System.out.println(cls.getField("score"));
System.out.println(cls.getDeclaredField("score"));
//获取私有方法报错
// System.out.println(cls.getField("grade"));
System.out.println(cls.getDeclaredField("grade"));
}
使用setAccessible,访问私有成员变量:
private static void privateField() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class cls = Class.forName("com.cathyjava.j2se.reflect.Student");
Student student = (Student) cls.getDeclaredConstructor().newInstance();
Field field = cls.getDeclaredField("grade");
field.setAccessible(true);
field.set(student, 2);
}
原来你是这样的JAVA[06]-反射的更多相关文章
- java原理—反射机制
http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程 ...
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java:反射
初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- java笔记--反射进阶之总结与详解
一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是 ...
- java笔记--反射机制之基础总结与详解
一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...
随机推荐
- 一篇文章告诉你什么是Java内存模型
在上篇 并发编程Bug起源:可见性.有序性和原子性问题,介绍了操作系统为了提示运行速度,做了各种优化,同时也带来数据的并发问题, 定义 在单线程系统中,代码按照顺序从上往下顺序执行,执行不会出现问题. ...
- remote: HTTP Basic:Access denied fatal:Authentication failed for
近来在一天新电脑上面使用git pull 一个项目,老是提示 Access denied, 找了许多方法,ssh key这些都配置了还是不行,当时别提有多尬 看嘛这就是pull 时的提示 // *** ...
- Multiserver游戏服务器Demo[C++&Lua]
代码参考 代码文件参考下述详解的类图,工程参考第零章工程说明 关键特性 对Socket库进行封装,抹平Socket的Window&Linux的平台差异. C++嵌入lua脚本,增加开发者编码效 ...
- 免费获取最新WebStorm激活码,永久激活WebStorm
在互联网上,目前还没有查询到一篇写得比较详细的WebStorm安装和激活教程.今天我将使用WebStorm最新2023年版本,从下载到安装以及创建项目带大家完整的走一遍. 分享的 WebStorm 2 ...
- \n被当成回车处理
Regex.Escape C# 字符串变量str 的值为"a\nb"如果直接输出显示的话,就成了:ab需要输出显示为:a\nb string str = "a\nb& ...
- wireshark基本使用
Wireshark 是一种开源.跨平台的网络数据包分析工具,能够嗅探和调查实时流量并检查数据包捕获 (PCAP).它通常 被用作最好的数据包分析工具之一. 数据包过滤操作 ip过滤器 IP 过滤器帮助 ...
- C++面试八股文:C++中,设计一个类要注意哪些东西?
某日二师兄参加XXX科技公司的C++工程师开发岗位第9面: 面试官:C++中,设计一个类要注意哪些东西? 二师兄:设计一个类主要考虑以下几个方面:1.面向对象的封装.继承及多态.2.big three ...
- CentOs7安装部署Sonar环境(JDK1.8+MySql5.7+sonarqube7.8)
sonarqube安装前环境准备JDK1.8.MySql5.7. 一.JDK安装 1.下载jdk #打开下面的网址,选择 jdk-8u371-linux-x64.tar.gz 进行下载 (8u371版 ...
- 前端Vue自定义简单实用中国省市区三级联动选择器
前端Vue自定义简单实用中国省市区三级联动选择器, 请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13118 效果图如下: 使用方法 < ...
- K8S | 容器和Pod组件
对比软件安装和运行: 一.场景 作为研发人员,通常自己电脑的系统环境都是非常复杂,在个人的习惯上,是按照下图的模块管理电脑的系统环境: 对于「基础设施」.「主机操作系统」.「系统软件」来说,通常只做配 ...