今天本人给大家讲解一下Java的反射基础技术,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!!

什么是反射?

反射它是根据字节码文件可以反射出类的信息、字段、方法、构造方法等内容,还可以创建对象调用方法,我们称它为反射技术。

如何通过反射获取Class对象了?

它有三种方法,1.通过Class获取类对象

2.通过getClass()方法获取类对象

3.通过Class.forName(“完整类名”)获取类对象

案例:通过反射获得Class对象的3种方法

Class c1 = ReflectionBasic.class;
Class c2 = new ReflectionBasic().getClass();
Class c3 = Class.forName("reflection.getClassObject.ReflectionBasic"); System.out.println(c1);
System.out.println(c2);
System.out.println(c3);

 运行结果:

 注意:Class.forName()它除了能获取Class对象,还可以将获取的类对象自动加载到JVM虚拟机的内存中去 ,下面案例的运行结果可以看出代码输出的static静态代码块一个泛型的C4和C5对象,可是只有C5输出了static,这就说明了使用Class.forName()可以将类对象加载到JVM虚拟机的内存中去。

案例:

 //通过输出OtherTest反射对象
Class<?> c4 = OtherTest.class;
System.out.println("此输出对象是C4==============================="+c4);
Class<?> c5 = Class.forName("reflection.getClassObject.OtherTest");
System.out.println("此输出对象是C5==============================="+c4);
class OtherTest{
static {
System.out.println("你好呀!!!宝宝们!!!");
}
}

运行结果:

获取反射类的信息

在java.lang.reflect包下有很多反射类信息的类

反射类的信息

接口类:

public interface IReflection {
}

父类:

public class Reflection {
}

主类:

public class ReflectionInfo extends Reflection implements IReflection {
public static void main(String[] args) {
//创建类的对象
Class<?> c1 = ReflectionInfo.class;
//获取反射ReflectionInfo类的================================修饰符
int modifiers = c1.getModifiers();//得到的是一个整数那么我们就需要转换了
System.out.println(modifiers);
String sModifiers = Modifier.toString(modifiers);//转换后得到的信息
System.out.println(sModifiers);
System.out.println("以上是获取反射ReflectionInfo类的================================修饰符");
//获取反射ReflectionInfo类的================================完整类名
String name = c1.getName();
System.out.println(name);
//获取反射ReflectionInfo类的================================简易类名
String simpleName = c1.getSimpleName();
System.out.println(simpleName);
System.out.println("以上是获取反射ReflectionInfo类的================================完整类名和简易类名");
//获取反射ReflectionInfo类的================================完整父类名
Class<?> superclass = c1.getSuperclass();
System.out.println(superclass.getSuperclass());
//获取反射ReflectionInfo类的================================简易父类名
System.out.println(superclass.getSimpleName());
System.out.println("以上是获取反射ReflectionInfo类的================================完整父类名和简易父类名");
//获取反射ReflectionInfo类的================================接口,由于接口可以是多个我们需要通过遍历来输出出来
Class<?>[] interfaces = c1.getInterfaces();
if(interfaces.length>0){
for (int i = 0; i < interfaces.length;i++){
//获取反射ReflectionInfo类的================================完整接口名
System.out.println(interfaces[i]);
//获取反射ReflectionInfo类的================================简易接口名
System.out.println(interfaces[i].getSimpleName());
}
}
}
}

运行结果:

通过反射技术访问字段(分private和public修饰)

错误案例:通过getFile()方法得到private属性的值,会报错

public class AccessFiled {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
//创建Class对象
Class<?> c1 = Company.class;
//返回返回的公共字段public
Field field = c1.getField("name");
//通过反射技术创建对象实例,默认调用无参构造哦
Object obj = c1.newInstance();//此方法相当于new一个Company对象
field.set(obj,"无名公司"); //设置name的字段值
System.out.println(obj);
System.out.println(field.get(obj));//输出name的字段值 //返回返回的公共字段public
Field fields = c1.getField("id");
//通过反射技术创建对象实例,默认调用无参构造哦
field.set(obj,"00001"); //设置name的字段值
System.out.println(field.get(obj));//输出name的字段值 }
}
class Company{
public String name;
private int id;
}

运行结果:

正确案例:使用getDeclaredField()方法得到private修饰的id值,这个是可以得到任意修饰符修饰的字段
public class AccessFiled {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
//创建Class对象
Class<?> c1 = Company.class;
//返回返回的公共字段public
Field field = c1.getField("name");
//通过反射技术创建对象实例,默认调用无参构造哦
Object obj = c1.newInstance();//此方法相当于new一个Company对象
field.set(obj,"无名公司"); //设置name的字段值
System.out.println(obj);
System.out.println(field.get(obj));//输出name的字段值 //返回返回的公共字段public
Field fields = c1.getDeclaredField("id");
//通过反射技术创建对象实例,默认调用无参构造哦
field.set(obj,"00001"); //设置name的字段值
System.out.println(field.get(obj));//输出name的字段值 }
}
class Company{
public String name;
private int id;
}

运行结果:

通过反射技术调用方法

public class CallObject {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
//创建Class对象
Class<?> c1 = Company.class;
//反射shou()方法
Method method = c1.getMethod("show", null);//前面的参数是方法名。后面的是方法的返回值类型
//通过反射创建实例
Object obj = c1.newInstance();
System.out.println("无参==========="+method.invoke(obj,null ));
System.out.println(obj);
Method shous = c1.getMethod("shows",String.class);
shous.invoke(obj,"无名公司");
//反射shows()方法带(参数列表类型)
System.out.println("有参==========="+obj);;
}
}
class Company{
public String name;
private int id; public void show(){
System.out.println("show=====方法");
}
public void shows(String name){
System.out.println("shows======方法");
this.name = name;
} @Override
public String toString() {
return "Company{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}

运行结果:

Java的反射基础讲解完毕,又不懂或者不理解的可以在评论区给本人留言,我会及时回复大家的。

Java的反射基础技术的更多相关文章

  1. Java Reflection 反射基础

    反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...

  2. 【已转移】【Java架构:基础技术】一篇文章搞掂:Java 8

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 一.Java的历史与演变 目的:为完全了解Java,需要理解Java的诞生原因.成型动力以及他继承的思想. 计算机语言的创新与发展 ...

  3. 【已转移】【Java架构:基础技术】一篇文章搞掂:Spring

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<SPRING实战第4版>的总结,大家也可以去仔细研读该书 [------------------------ ...

  4. Java核心技术卷一基础技术-第13章-集合-读书笔记

    第13章 集合 本章内容: * 集合接口 * 具体的集合 * 集合框架 * 算法 * 遗留的集合 13.1 集合接口 Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制. 13. ...

  5. 【Java架构:基础技术】一篇文章搞掂:Spring Boot 官方文档解读

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文内容大部分是翻译和总结官方文档,可以到https://docs.spring.io/spring-boot/docs查看(此地 ...

  6. 【Java架构:基础技术】一篇文章搞掂:MyBatis-Plus

    前言 Mybatis:一个流行的半自动ORM框架. Mybatis-Plus:一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发.提高效率而生. 本文使用的版本:myb ...

  7. 【Java架构:基础技术】一篇文章搞掂:MyBatis

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文主要总结于刘增辉的<MyBatisc从入门到精通>一书,有兴趣的朋友可以自行研读 建议仔细研读官方文档: http ...

  8. 【Java架构:基础技术】一篇文章搞掂:Gradle

    前言 Gradle是什么: Gradle提供了一个域特定语言(DSL),用于描述构建 它使用 Groovy 语言,使其更容易来形容和构建 Gradle 中的每一个构建脚本使用UTF-8进行编码保存,并 ...

  9. 【Java架构:基础技术】一篇文章搞掂:Maven

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文基于<Maven 实战>一书进行总结和扩展,大家也可以自行研读此书. 一.Maven简介 1.1.什么是Maven ...

随机推荐

  1. CSS性能优化探讨

    大部分前端开发人员都不关心CSS性能优化,其实对于一个复杂的页面来说,高效的选择器还是可以带来一定的性能提升的. 1. CSS 选择器 浏览器是“从右往左”来分析 class 的,它的匹配规则是从右向 ...

  2. ArrayList查找和添加元素问题

    问题描述: 如上图所示,如果依靠迭代器在List中查找元素并添加元素,会报错:java.util.ConcurrentModificationException原因是在添加元素后,List本身发生了变 ...

  3. id0-rsa WP合集

    忙里偷闲做做题wwwwwwwwwwwww Intro to Hashing Intro to PGP Hello PGP Hello OpenSSL Intro to RSA Caesar Hello ...

  4. spring入门(14)

    AOP是一个新的专题,基础部分主要是入门 后续的五.六.七都属于AOP专题: 所以有必要对这三章要学什么有个全局的认识. 1 概要 1 什么是AOP及实现方式 介绍了AOP的用途,以及大致的实现方案 ...

  5. api安全规范

    1. API签名的目的 校验API调用者的身份,是否有权访问    校验请求的数据完整性,防止被中间人篡改    防止重放攻击 2.基本概念 AccessKey: API使用者向API提供方申请的Ac ...

  6. TCP可靠传输的工作原理

    TCP可靠传输的工作原理 一.停止等待协议 1.1.简介 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数据在分组传输的平均往返时间更 ...

  7. 批量复制及执行命令shell脚本

    平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可 ...

  8. PKI详解

    预备: 一.密码基元 二.密钥管理 三.PKI本质是把非对称密钥管理标准化 PKI 是 Public Key Infrastructure 的缩写,其主要功能是绑定证书持有者的身份和相关的密钥对(通过 ...

  9. qt creator源码全方面分析(3-2)

    目录 qtcreator.pri 判断重复包含 定义版本信息 VERSION 定义IDE名称 启用C++14 CONFIG 自定义函数 Replace Functions Test Functions ...

  10. JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨

    5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...