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类的理解

  1. 类的加载过程:程序经过java.exe命令以后,会生成一个或多个字节码文件(.class),接着使用java.exe命令对字节码进行解释运行。相当与将某个字节码文件加载到内存中,此过程称为类的加载。加载到内存中的类,我们称之为运行时类,此运行时类,就作为Class的一个实例。
  2. Class的实例就是对应着一个运行时类。
  3. 加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同方式来获取从运行时类。
// 获取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_基础反射机制的更多相关文章

  1. java基础——反射机制

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

  2. JAVA基础-反射机制

    什么是JAVA的反射机制 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其 ...

  3. Java基础--反射机制的知识点梳理

    什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法 ...

  4. JAVA_基础反射创建运行时类的对象

    通过反射去创建对应的运行时类的对象 newInstance():调用此方法,创建对应的运行时类的对象.内部调用的是空参的构造器. 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参构 ...

  5. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

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

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

  7. 黑马程序员_Java基础:反射机制(Reflection)总结

    ------- android培训.java培训.期待与您交流! ---------- 反射在java中有非常重大的意义,它是一种动态的相关机制,可以于运行时加载.探知.使用编译期间完全未知的clas ...

  8. java反射机制(基础版)

    package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ja ...

  9. JAVA反射机制基础概念

    反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QTableView的wordWrap属性

    老猿Python博文目录 老猿Python博客地址 wordWrap属性用于控制视图中数据项文本的换行策略.如果此属性为True,则在数据项文本中分词的适当处进行换:否则数据项文本不进行换行处理.默认 ...

  2. Hive基本原理及配置Mysql作为Hive的默认数据库

    Hive是什么? Hive是基于Hadoop之上的数据仓库: Hive是一种可以存储.查询.分析存储在hadoop中的大规模数据 Hive定义了简单的类SQL查询语言,成为HQL,它允许熟悉SQL的用 ...

  3. 实验吧 Once more

    0x1函数解析 ereg(): *用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false. 搜索字母的字符是大小写敏感的. * 此函数存在两个漏洞: ①%00截断及 ...

  4. Geoserver对发布的数据源进行金字塔切片

    一.建立切片数据源 1.1建立工作区 1.2添加数据 我这里是老师给的高清卫星地图数据,格式为tif 工作区选择之前建立的工作区,浏览那里选择对应的文件 1.3建立切片源的图层 这里建立的图层中先不用 ...

  5. 【JVM】类加载器与双亲委派

    类加载器,顾名思义,即是实现类加载的功能模块,负责将Class的字节码形式加载成内存形式的Class对象.字节码文件可来源于磁盘或者jar包中的Class文件,也可以来自网络字节流. 类加载器 在JV ...

  6. GYM100526I Interesting Integers

    题目大意 定义一种 \(Gabonacci\) 数列: \[\begin{array}{c} G_1=a\\ G_2=b\\ G_i=G_{i-1}+G_{i-2} \end{array} \] 给定 ...

  7. nginx学习之——信号控制和配置

    一.信号控制 1)TERM, INT   Quick shutdown  \\麻溜停掉(暴力停止),一般不常用 // 启动和停止nginx 当前目录:/usr/local/bin/nginx 启动: ...

  8. 谷歌SameSite策略

    当我新下载谷歌80.x版本的时候,访问一个系统(内嵌跳转到其他系统的iframe),跳转过去没有携带cookie,以前版本的谷歌浏览器是可以的,控制台提示SameSite策略,给阻止了cookie携带 ...

  9. Pandownload网页版复活

    不注册则每人每天5次机会,注册或邀请别人注册都可以获得30次额外的下载机会. 1.将百度云链接复制粘贴到解析,点击打开,等待解析. 2.获取链接成功后会跳转到下载界面,里面有详细的使用教程,自行查看 ...

  10. 深入解析 C# 的 String.Create 的方法

    作者:Casey McQuillan 译者:精致码农 原文:http://dwz.win/YVW 说明:原文比较长,翻译时精简了很多内容,对于不重要的细枝末节只用了一句话概括,但不并影响阅读. 你还记 ...