JAVA_基础反射机制
Java反射机制概述
Reflection
(反射)是被视为动态语言的关键,反射机制允许程序在执行期 借助于Reflection API
取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。
正常方式: 引入需要的包名称 → 通过new实例化对象 → 取得实例化对象
反射方式: 通过实例化对象 → getClass()方法 → 得到完整的包名称
Java反射机制提供的功能
- 在运行时判断任意一个对象所属的类。
- 在运行时构造任意一个类的对象。
- 在运行时判断任意一个类所具有的成员变量和方法。
- 在运行时获取泛型信息。
- 在运行时调用任意一个对象的成员变量和方法。
- 在运行时处理注解。
- 生成动态代理。
public class Person {
private String name;
public int age;
public void show() {
System.out.println("您好!世界");
}
private String showNation(String nation){
System.out.println("我的国际是:" + nation);
return nation;
}
private Person(String name) {
this.name = name;
}
.....
}
public void test2() throws Exception {
Class clazz = Person.class;
// 1.通过反射,创建Person类的对象
Constructor cons = clazz.getConstructor(String.class, int.class);
Object obj = cons.newInstance("Tom", 12);
Person p = (Person) obj;
System.out.println(p.toString());
// 2.通过反射,调用指定的属性、方法、对象
// 调属性
Field age = clazz.getDeclaredField("age");
age.set(p,10);
System.out.println(p.toString());
// 调方法
Method method = clazz.getDeclaredMethod("show");
method.invoke(p);
// 通过反射是可以调用私有的属性、方法、构造器
// 调用私有构造器
Constructor cons1 = clazz.getDeclaredConstructor(String.class);
cons1.setAccessible(true);
Person p1 = (Person) cons1.newInstance("Jerry");
System.out.println(p1);
// 调用私有方法
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(p1,"Han");
System.out.println(p1);
// 调用私有方法
Method method1 = clazz.getDeclaredMethod("showNation", String.class);
method1.setAccessible(true);
String invoke = (String) method1.invoke(p1, "中国");
System.out.println(invoke);
}
java.lang.Class类的理解
- 类的加载过程:程序经过java.exe命令以后,会生成一个或多个字节码文件(.class),接着使用java.exe命令对字节码进行解释运行。相当与将某个字节码文件加载到内存中,此过程称为类的加载。加载到内存中的类,我们称之为运行时类,此运行时类,就作为Class的一个实例。
- Class的实例就是对应着一个运行时类。
- 加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同方式来获取从运行时类。
// 获取Class的实例的方法
public void test3() throws ClassNotFoundException {
// 方式一:调用运行时类的属性.class
Class clazz1 = Person.class;
// 方式二:通过运行时类的对象
Person person = new Person();
Class clazz2 = person.getClass();
// 方法三:调用Class的静态方法forName(String classPath)
Class clazz3 = Class.forName("com.tyt.java.Person");
// 方式四:类的加载器 ClassLoader
ClassLoader classLoader = ReflectionTest.class.getClassLoader();
Class clazz4 = classLoader.loadClass("com.tyt.java.Person");
System.out.println(clazz1 == clazz2);
System.out.println(clazz2 == clazz3);
System.out.println(clazz3 == clazz4);
}
Class实例可以是那些结构的说明:
public void test5() {
Class c1 = Object.class;
Class c2 = Comparable.class;
Class c3 = String[].class;
Class c4 = int[][].class;
Class c5 = ElementType.class;
Class c6 = Override.class;
Class c7 = int.class;
Class c8 = void.class;
Class c9 = Class.class;
int[] a = new int[10];
int[] b = new int[100];
Class c10 = a.getClass();
Class c11 = b.getClass();
// 只要数组元素类型与维度一样,就是同一个Class
System.out.println(c10 == c11);// true
}
使用Properties:用于读取配置文件。
// 目录结构
// |--module
// |---stc
// |----com.tyt.java
// |-----PropertiesTest.java
// |-----jdbc1.properties
// |--jdbc.properties
public void test2() {
String user = null;
String passwored = null;
FileInputStream inputStream = null;
try {
Properties properties = new Properties();
// 读取配置方式一:
// inputStream = new FileInputStream("jdbc.properties");
// properties.load(inputStream);
// 读取配置方式二:使用ClassLoader
// 配置文件默认识别为:当前module的src下
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
InputStream inputStream1 = classLoader.getResourceAsStream("jdbc1.properties");
properties.load(inputStream1);
user = properties.getProperty("user");
passwored = properties.getProperty("passwored");
System.out.println("user = " + user + ",passwored = " + passwored);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
JAVA_基础反射机制的更多相关文章
- java基础——反射机制
反射机制是什么 反射机制就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- JAVA基础-反射机制
什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...
- Java基础--反射机制的知识点梳理
什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法 ...
- JAVA_基础反射创建运行时类的对象
通过反射去创建对应的运行时类的对象 newInstance():调用此方法,创建对应的运行时类的对象.内部调用的是空参的构造器. 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参构 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- 黑马程序员_Java基础:反射机制(Reflection)总结
------- android培训.java培训.期待与您交流! ---------- 反射在java中有非常重大的意义,它是一种动态的相关机制,可以于运行时加载.探知.使用编译期间完全未知的clas ...
- java反射机制(基础版)
package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ja ...
- JAVA反射机制基础概念
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...
随机推荐
- 【软件测试部署基础】npm的认识
1. npm简介 先来看下官方介绍: npm makes it easy for JavaScript developers to share and reuse code, and it makes ...
- LZZ磁力资源搜索4.2.2,整合多个站点,大部分资源都能搜到
资源搜索 4.2.2.20200310网友提出的功能已完成1:新增 时间日期排序,单击表头或右键菜单选择,即可自动排序2:新增 搜索完毕 音效开启或关闭 选项3:资源站点 Sunyaa 由聚合站点改为 ...
- 再也不怕 JavaScript 报错了,怎么看怎么处理都在这
在开发中,有时,我们花了几个小时写的 JS 代码,在游览器调试一看,控制台一堆红,瞬间一万头草泥马奔腾而来.至此,本文主要记录 JS 常见的一些报错类型,以及常见的报错信息,分析其报错原因,并给予处理 ...
- 实现一个类型判断函数,需要鉴别出基本类型、function、null、NaN、数组、对象?
只需要鉴别这些类型那么使用typeof即可,要鉴别null先判断双等判断是否为null,之后使用typeof判断,如果是obejct的话,再用Array.isArray判断是否为数组,如果是数字再使用 ...
- C# 9.0新特性详解系列之五:记录(record)和with表达式
1 背景与动机 传统面向对象编程的核心思想是一个对象有着唯一标识,表现为对象引用,封装着随时可变的属性状态,如果你改变了一个属性的状态,这个对象还是原来那个对象,就是对象引用没有因为状态的改变而改变, ...
- Notepad++ 使用步骤,熟练掌握notepad++的使用技巧,无疑会大大提升专业技能。以及快捷键操作
官方下载地址: https://notepad-plus.en.softonic.com/ 1.安装 双击安装包出现以下界面 2.点击我接受 3.安装地址 继续下一步 4.默认即可,继续下一步 5.根 ...
- 要你命3000会员版v20.03_全球抖音模式
要你命3000是搭配抖音和极其多软件的神器,支持国际版.国内版,可以去除全部限制,无需爬墙,无需拔卡,35个国家/自由切换,真心强大,请务必低调,谢谢合作. 下载地址:https://sansuinb ...
- Graphql Tutorials(Episode 02)
1.前言 我们在上篇已经了解Graphql的使命以及Graphql的概况,接下来,我们跑起来另外一个Helloworld来开启继续学习. 2.Helloworld(使用Graphql 原生API) 这 ...
- vue 事件函数传参
事件函数传参 在元素绑定事件时候,如果我们的函数没有传参,他也会有一个默认的传参值 event 但是如果我们的函数有传参,那么它必须作为做为最后一个传参值显示传递,且必须为$event 通过代码打印我 ...
- JeecgBoot table 渲染图片
使用jeecgboot框架,在table列表显示图片 使用Column 的customRender属性 通过以上设置,就会在列表页显示图片了