生活中迷茫感的产生,往往源之于坚持一件事放弃的那一刻,因为从那一刻起,你开始变得无聊,变得没有方向感。


  • 运行环境

   JDK8 + IntelliJ IDEA 2018.3 

  • 本文中使用的jar包链接

https://files.cnblogs.com/files/papercy/jsoup_jar%E5%8C%85.rar
  • 概述

1、Java反射机制(Java-Reflect):

  ava 反射是Java语言的一个很重要的特征,它使得Java具有了“动态性”。
  Java提供了一套机制来动态获取类的信息以及动态调用对象的方法的功能,这套机制就叫——反射

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

  反射机制是如今很多流行框架的实现基础,其中包括Struts、Spring、Hibernate等。

  反射是Java开发中一个非常重要的概念,掌握了反射的知识,才能更好的学习Java高级课程.

2、Java 反射机制的功能
  1. 在运行时判断任意一个对象所属的类。

  2. 在运行时构造任意一个类的对象。

  3. 在运行时判断任意一个类所具有的成员变量和方法。

  4. 在运行时调用任意一个对象的方法。

  5. 生成动态代理。

  • 通过JAVA反射查看类信息

1、获得Class对象

每个类被加载之后,系统就会为该类生成一个对应的Class对象。通过该Class对象就可以访问到JVM中的这个类。

在Java程序中获得Class对象通常有如下四种方式:

  • obj.getClass();
        Object obj=new String();
Class clz1 = obj.getClass();
System.out.println("第一种:"+clz1);
  • class属性
 Class clz2 = String.class;
System.out.println("第二种:"+clz2);
  • Class.forName();
 Class clz3 = Class.forName("java.lang.String");
System.out.println("第三种:"+clz3);
  • ClassLoader
 ClassLoader cl = ClassLoader.getSystemClassLoader();
Class clz4 = cl.loadClass("java.util.ArrayList");
System.out.println("第四种:"+clz4);

 

 运行结果:

  • 构造方法

public static void main(String[] args) throws Exception {
//反射string 类的所有构造方法
Class clz = Student.class;
System.out.println("所有构造方法:");
Constructor[] cons = clz.getConstructors();
cons = clz.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println("访问修饰权限:" +
Modifier.toString(con.getModifiers()));
System.out.println("方法名:" + con.getName());
System.out.println("****************************");
System.out.println(Modifier.toString(con.getModifiers()) + " "
+ con.getName());
} System.out.println("=============================="); //找无参的构造方法
Student s = new Student();
Constructor con = clz.getDeclaredConstructor();
Object obj = con.newInstance();
System.out.println(obj); //找带string,int类型参数的构造方法
Student s1 = new Student("zhangsan",12);
con = clz.getDeclaredConstructor(String.class, int.class);
obj = con.newInstance("zhangsan", 12);
System.out.println(obj); con = clz.getDeclaredConstructor(String.class); }

 

 运行结果:



  • Class中的常用方法(获得类的属性)

 1  public static void main(String[] args) throws Exception {
2
3 Class clz = Student.class;
4
5 System.out.println("得到所有字段:");
6 Field[] fields = clz.getDeclaredFields();
7 for(Field field : fields) {
8 System.out.println(Modifier.toString(field.getModifiers())+" " + field.getType().getSimpleName() + " " + field.getName());
9 }
10 //利用反射为s学生对象的两个属性字段赋值
11 Student s= new Student();
12 Class clzz = s.getClass();
13 System.out.println(clzz);
14 System.out.println("======================");
15
16 //为x字段赋值
17 Field field_x = clzz.getField("x");
18 field_x.set(s, "feifeiye");
19 System.out.println(s.x);
20 System.out.println("======================");
21
22 //得到name字段
23 Field field_name = clzz.getDeclaredField("name");
24 field_name.setAccessible(true);
25 field_name.set(s, "zhangsan");
26 field_name.setAccessible(false);
27
28 Field field_age = clzz.getDeclaredField("age");
29 field_age.setAccessible(true);
30 field_age.set(s, 20);
31 field_age.setAccessible(false);
32 System.out.println(s);
33
34 }

  

  运行结果:

  • Class中的常用方法(获得类的方法)

 1 public static void main(String[] args) throws Exception {
2 Class clz = Student.class;
3
4 Method[] methods = clz.getDeclaredMethods();
5 for (Method method : methods) {
6 Class[] clzz = method.getParameterTypes();
7 String temp = "";
8 for(Class cz:clzz) {
9 temp += cz.getSimpleName()+",";
10 }
11
12 System.out.println(Modifier.toString(method.getModifiers()) + " "
13 + method.getReturnType().getSimpleName() + " "
14 + method.getName()+"("+temp+")");
15 }
16
17
18 //调用类无参的构造方法实例化对象
19 Student st = (Student)clz.newInstance();
20
21 //调用无参的构造方法实例化
22 Student st1 = (Student)clz.getConstructor().newInstance();
23
24
25 //得到fun1方法并调用
26 Method method_fun1 = clz.getMethod("fun1", String.class, int.class);
27 method_fun1.invoke(st, "feifeiye", 100);
28
29
30 Method method_fun2 = clz.getMethod("fun2", String.class, int.class, double.class);
31 Object returnValue = method_fun2.invoke(st, "feifeiye",200, 3.14);
32 System.out.println(returnValue);
33
34
35 }

 运行结果:

  • 反射动态调用类的成员

调用方法步骤:

  1. 设定调用方法的参数列表(Class[])
  2. 获得调用方法的对象(Method)
  3. 设定调用方法的参数的值(Object[])
  4. 普通方法:invoke(obj,values);
  5. 构造方法:newInstance(values)

调用属性步骤:

  1. 根据属性名字获得属性对象(Field)
  2. 赋值:set(obj,value)
  3. 取值:get(obj)
  • 如果需要强制访问类的私有成员,则需要设定:setAccessible(true);

  • 总结

Class是一个特殊的类,它的实例用来表示一个.class文件在内存中的存在形势。

反射就是照镜子,照出类的内部结构。

利用反射,可以在运行状态下初始化类。

Java--反射机制——反射 API(Day_04)的更多相关文章

  1. Java进阶之reflection(反射机制)——反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  2. <Java><类加载机制><反射>

    类加载过程 类从被加载到虚拟机内存开始,直到卸载出内存,它的整个生命周期包括:加载(Loading), 验证(Verification), 准备(Preparation), 解析(Resolution ...

  3. java 反射机制01

    // */ // ]]>   java反射机制01 Table of Contents 1 反射机制 2 反射成员 2.1 java.lang.Class 2.2 Constructor 2.3 ...

  4. 【java提高】---java反射机制

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

  5. Java 核心类库之反射机制

    1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...

  6. Java 反射机制应用实践

    反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start(https://docs.oracle.com/javase/ ...

  7. Java中的反射机制

    Java反射机制 反射机制定义 反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作.由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的 ...

  8. java反射机制的简单使用

    java 反射机制 反射机制简介 参考地址 什么是反射机制 反射机制指程序在运行时能够获取自身的信息.在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 反射机制的优缺点 首先了解一下动 ...

  9. 利用JAVA反射机制设计通用的DAO

    利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,    那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...

  10. day11 Java反射机制

    java反射机制 反射是java中的动态机制,它允许我们在程序运行期间再确定类的实例化,方法的调用,属性的调用等,而不是传统意义上的在编码期间确定. 因此,反射可以大大的提高代码的灵活度,但是随之而来 ...

随机推荐

  1. Day05_24_继承

    继承 什么是继承? 继承本质上是对某一批类的抽象,从而实现对现实世界更好的建模.继承是类和类之间的一种关系,除此之外类和类之间的关系还有依赖.组合.聚合等. 继承就是子类(派生类)继承父类(基类)的特 ...

  2. Jenkins 自定义构建结果

    1. Jenkins 构建原理 2. 脚本执行失败立即停止执行 3. 脚本执行失败继续后面的执行但最终的结果是构建失败 1. Jenkins 构建原理 Jenkins 的构建成功和脚本执行成功是两个事 ...

  3. openpyxl 库

    1. 简介与安装 2.具体示例 2.1 获取workbook与sheet对象 2.2 访问单元格及其值 2.3 写数据 2.4 设置样式 1. 简介与安装 openpyxl 简介 openpyxl 是 ...

  4. [Java] 数据类型, 变量, 运算符, 表达式

    title: [Java] 变量与表达式 你已经学会输出 Hello world 了, 那么现在, 我们来学习关于变量的知识 基本数据类型 在 Java 中, 有 8 种基本的数据类型: 名称 描述 ...

  5. 1.7.8- HTML合并单元格

    跨行与跨列

  6. 06- web兼容性测试与web兼容性测试工具

    web兼容性概述 定义:软件兼容性测试是指检查软件之间能否正确地进行交互和共享信息.随着用户对来自各种类型软件之间共享数据能力和充分利用空间同时执行多个程序能力的要求,测试软件之间能否协作变得越来越重 ...

  7. sublime text 快捷键的使用大全

    多行选择后按下ctrl+/ 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中 ...

  8. Android so加固的简单脱壳

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78077603 Android应用的so库文件的加固一直存在,也比较常见,特地花时间 ...

  9. RHCE7 认证之学习笔记

    -------------------------------------------------------------------------------------------初始化:两台服务器 ...

  10. 19.Vuex详细使用说明-一篇文章涵盖所有知识点

    vuex官网: https://vuex.vuejs.org/zh/ 一. 前言 不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要. 什么是共享状态? 比如 ...