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


  • 运行环境

   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. 黑马 - poi Excel2

    文件上传: //划线处值得效仿 构造用户列表:User.java 批量保存用户

  2. 《Python编程:从入门到实践》基础知识部分学习笔记整理

    简介 此笔记为<Python编程:从入门到实践>中前 11 章的基础知识部分的学习笔记,不包含后面的项目部分. 书籍评价 从系统学习 Python 的角度,不推荐此书,个人更推荐使用< ...

  3. Day12_62_线程的生命周期

    线程的生命周期 要实现多线程,必须在主线程中创建新的线程对象. 任何线程一般都具有五种状态,即创建,就绪,运行,阻塞,终止(消亡) 新建状态:在程序中创建了一个新的线程对象后,新的线程对象便处于新建状 ...

  4. @valid和自定义异常

    @valid和自定义异常 问题的产生: 当有很多参数需要校验时,比如name,age,email等很多参数都需要判空,或者有长度限制时,如果后端写很多if-else就有很多代码,不美观,不优雅.前端每 ...

  5. CAP 5.0 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 5.0 版本正式版.同时我们也很高兴的告诉你 CAP 已经有越来越多的用户并且变得越来越流行. 在 5.0 版本中,我们主要致力于更好的支持 .NET 5 以 ...

  6. 配置 ESLint 自动格式化自闭合标签(Self closing tag)

    对于没有子元素或不需要子元素的 HTML 标签,通常写成其自闭合的形式会显得简洁些, - <SomeComponent></SomeComponent> + <SomeC ...

  7. 书评第001篇:《C++黑客编程揭秘与防范》

    本书基本信息 作者:冀云(编著) 出版社:人民邮电出版社 出版时间:2012-6-1 ISBN:9787115280640 版次:1 页数:265 字数:406000 印刷时间:2012-6-1 开本 ...

  8. hdu4950 打怪(简单题目)

    题意:       打怪,一开始怪有h滴血,每回合可以让对方减少a滴血,每次打完之后怪会恢复b滴血,每连续k回合之后自己会休息一回合,这一回合怪物依然回血,问是否可以把怪打死. 思路:      比较 ...

  9. Python中的Pandas模块

    目录 Pandas Series 序列的创建 序列的读取 DataFrame DataFrame的创建 DataFrame数据的读取 Panel Panel的创建 Pandas Pandas ( Py ...

  10. androguard安装和体验

    安装步骤按照官方教程https://code.google.com/p/androguard/wiki/Installation,下面记录下无法在ubuntu下apt-get的模块: python模块 ...