Java 反射之根基 Class 类

Java中反射机制很重要,Java的动态语言就是靠反射机制实现的,反射技术也是程序员走的更远必不可少的一个技能。一般情况下我们都是通过类来创建对象,如果要求通过一个对象找到一个类,就需要用到反射机制,各种开源框架的编写更是离不开反射的机制。

一、了解反射机制

一般我们写代码,按照如下的步骤使用一个类:

1、使用关键字 import 导入类所在的包;

2、使用类名称或者接口名称定义对象;

3、通过关键字 new 进行类对象实例化;

4、使用【对象.属性】进行类中属性的调用;

5、使用【对象.方法】进行类中方法的调用;

而 Java 中的反射过程就是指:在程序的运行过程中,把 Java 类中的各种元素映射成对应的类,并能动态的执行这些类的方法。

Java 反射机制里重要的几个类:

类:java.lang.Class

属性:java.lang.reflect.Field

构造方法:java.lang.reflect.Constructor

方法:java.lang.reflect.Method

用反射可以轻松的获取一个类中的以上元素,并可以动态地对其进行调用,在不知道别人写的代码的时候,可以通过配置来调用别人的代码,很多开源框架都离不开反射机制,反射的魅力也正如此。

二、认识 Class 类

1、了解 Object 类:

我们知道如果一个类没有明确的声明集成自哪个父类时,那么它默认继承 Object 类,Object 类是所有类的父类。

Object 类中的 getClass()方法的源码:

public final native Class<?> getClass();

getClass()方法返回的类型是一个 Class 类,Class 类就是 Java 反射的源头。以上的源码用到了 native 关键字和泛型,使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++ 语言实现的,由 Java 通过 JNI 去调用的本地接口;如果不让程序出现警告信息,可以在使用时指定其操作的泛型具体类型,或者直接用“?”来取代。

2、获取 Class 类的 4 种实例化方式:

1、通过类本身的 class 属性实例化【类.class】;

2、通过 Object 类的 getClass()方法实例化【对象.getClass()】;

3、通过【Class.forName()方法】实例化,这种方式最常用,体现出了反射的动态性;

4、通过类的加载器获取;

```java /* * 如何获取Class类的实例的4种方式 / @Test public void TestClass() throws Exception { // 1、调用运行时类本身的.class属性 Class<?> clazz = User.class; System.out.println(clazz);

// 2、通过运行时类的对象获取
User p = new User();
Class<?> clazz1 = p.getClass();
System.out.println(clazz1);// 3、通过Class的静态方法获取,体现了反射的动态性,
// 传入className就能创建Class类的实例
String className = "com.jpm.reflection.User";
Class<?> clazz3 = Class.forName(className);
System.out.println(clazz3);// 4、通过类的加载器获取
ClassLoader classLoader = this.getClass().getClassLoader();
Class clazz4 = classLoader.loadClass(className);
System.out.println(clazz4);

}

/* * User类,用于演示反射,为了不影响体验,代码见文章末尾 / ```

运行结果:

class com.jpm.reflection.User
class com.jpm.reflection.User
class com.jpm.reflection.User
class com.jpm.reflection.User

三、类的加载器 ClassLoader

1、了解 Class 类的 3 种加载器:

1、系统类加载器(AppClassLoader):加载自定义类和普通 jar 包;

2、扩展类加载器(ExtClassLoader):加载 jre/lib/ext 目录下的类;

3、启动类加载器(BootStrapClassLoader):加载 jdk 的核心类库,启动类加载器 Java 代码获取不到;

/**

运行结果:

sun.misc.Launcher$AppClassLoader@7852e922
sun.misc.Launcher$ExtClassLoader@330bedb4
null
sun.misc.Launcher$AppClassLoader@7852e922
null

2、类加载器的应用案例

1、获取 Java 包里的配置文件

@Test

配置文件内容:

运行结果:

properties
jdbc.properties
txt
jdbc.txt

2、获取工程下的配置文件

上面的类加载器获取 java 包里的配置文件,但是不能获取工程目录下的文件,要想获取工程目录下的文件,可以使用如下的代码:

@Test

运行结果:

root
root123

四、Java 反射初体验

下面一个例子用来演示如何通过 Java 的反射机制,动态创建 User 类对象,并调用 User 类对象的属性赋值以及调用它的方法。

/**

运行结果:

User [name=null, age=0]
User [name=JPM, age=0]
User [name=JPM, age=18]
show method run!
display method run,address=BJ

本文主要介绍了反射的概念、反射的源头 Class 类、类的 3 种加载器、类加载器ClassLoader 的应用场景、用Java 反射获取用户自定义类User,初步体验了 Java 反射机制的魅力。

后面我会用 2 篇文章来说明 Java 反射机制的深入体验,反射的高级应用动态代理的实现,敬请期待......

java 类.class_Java 反射之根基 Class 类相关推荐

  1. 包里替换class文件_Java 反射之根基 Class 类

    Java 反射之根基 Class 类 Java中反射机制很重要,Java的动态语言就是靠反射机制实现的,反射技术也是程序员走的更远必不可少的一个技能.一般情况下我们都是通过类来创建对象,如果要求通过一 ...

  2. 谈谈Java中的反射与Class等类

    反射与Class类 (所有源代码已经上传到码云上:https://gitee.com/c3h2/knowledge-study.git 该章节所属reflect包中,具体代码开编号,每个类都有编号) ...

  3. java基础学习:java中的反射

    一.什么是java反射 什么是 java 的反射? 说到反射,写这篇文章时,我突然想到了人的"反省",反省是什么?吾一日三省吾身,一般就是反思自身,今天做了哪些对或错的事情. ja ...

  4. java Class类与反射

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

  5. java中class_JAVA中的Class类

    前言 Class类是一个看起来熟悉又看起来陌生的类,平时常常用到它,但却从来没有创建过它的实例对象,因为它的构造函数是私有的,只有虚拟机才能够创建它的对象,但是它绝对是一个核心类,以至于要学好java ...

  6. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName(全路径名) 、getClass()、class...

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

  7. Java源码:java.lang.reflect反射之AccessibleObject、ReflectionFactory、Filed、Method、Constructor类

    //by yan 20191206 Java的反射机制,它的定义是:程序在运行中时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性.简单的来说就是 ...

  8. java 反射类成员_java 反射(二)类成员

    在Java反射的包中定义一个接口java.lang.reflect.Member,它有三个实现类java.lang.reflect.Field, java.lang.reflect.Method, a ...

  9. java 反射 本类_Java 反射 Class类

    Java 反射 Class类 @author ixenos 摘要:Class类在反射中的地位.构造Class对象的三种方式.Class对象构造对应类型对象的三种方式 Class类在反射中的地位 位于j ...

最新文章

  1. 设计中涉及到的dip、dp、px、sp等单位说明
  2. Linux C编程--fork 详解
  3. VC++下命名管道编程的原理及实现
  4. 红帽linux6.0安装教程,第 14 章 引导安装程序
  5. MySQL5.7更改用户名密码
  6. 复习---使用基础语法实现栈及迭代
  7. 付费社群聊天小程序V1.4.5+前端
  8. mysql u0019_mysql服务无法启动
  9. Linux之ioctl20160705
  10. python编程入门 适合于零基础朋友-Python不能帮你找到女朋友,却能让你成为有钱的单身狗。...
  11. 【渝粤教育】国家开放大学2018年秋季 1070t组织行为学 参考试题
  12. 冒泡排序法C语言代码
  13. 【线性代数】矩阵的运算公式速查
  14. 三连问:MySQL如何实现可重复读、又为什么会出现幻读、是否解决了幻读问题?...
  15. 第06章 软件架构设计 之 软件架构风格
  16. 国产操作系统都有哪些功能?普通人能满足日常使用吗?
  17. 如何解决独立站多渠道客户沟通难题?这款跨境电商插件一定要知道!
  18. 阿里巴巴、Amazon、Windows、Android、Google、Internet、iPhone、汽车底盘、以及信用卡都属于平台经济--产品平台---供应链平台---产业平台--双边市场平台
  19. 计算机无法删除ie,ie浏览器图标删除不了怎么办 Win7中IE浏览器图标无法删除解决方法...
  20. 七夕 | 情人节 | 用Python给你送个钻石戒指

热门文章

  1. Javascript 学习笔记 - 函数 - 关于IIFE - 关于函数声明和函数表达式 - 个人总结
  2. HDU1214 圆桌会议【数学】
  3. Bailian2683 求分数序列和【数列和】
  4. libsvm 的使用
  5. GPU-Z:显卡体质、显卡各传感器实时状态的查看
  6. 计算机体系结构的分类
  7. Matlab Tricks(十五) —— 圆的正确画法
  8. SecondaryNameNode 的作用
  9. 推理集 —— 举一反三
  10. Python Tricks(一)—— np.where 与最大最小截断