今天本人给大家讲解一下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. 化学键|甘氨酸|谷氨酸|半胱胺酸|motif|domain|疏水相互作用|序列相似性|clustering analysis|Chou and Fasman|GOR|PHD|穿线法|first-principle ab initio folding|

    化学键|甘氨酸|谷氨酸|半胱胺酸|motif|domain|疏水相互作用|序列相似性|clustering analysis|Chou and Fasman|GOR|PHD|穿线法|first-pri ...

  2. Java IO: RandomAccessFile

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) RandomAccessFile允许你来回读写文件,也可以替换文件中的某些部分.FileIn ...

  3. gin源码剖析

    介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:https:// ...

  4. 吴裕雄--天生自然HTML学习笔记:HTML <div> 和<span>

    HTML <div> 和<span> HTML 可以通过 <div> 和 <span>将元素组合起来. HTML 区块元素 大多数 HTML 元素被定义 ...

  5. 多线程并发 了解 Thread

    通过上一篇 多线程并发 (一) 了解 Java 虚拟机 - JVM 了解了java 虚拟机的构成以及对象的创建等.从Java虚拟机栈我们知道每当我们创建一个线程JVM就会给我们的线程分配一个私有的内存 ...

  6. 测试一个数字是否等于 NaN

    ES6提供了一个新的 Number.isNaN() 函数,这是一个不同的函数,并且比老的全局 isNaN() 函数更可靠.

  7. LG承认手机业务遭到中国厂商碾压!这是输得心服口服的节奏?

    近日,关于LG手机业退出中国市场的消息传的沸沸洋洋.不少相关媒体也对此事向LG北京办事处求证,得到的结果确实是手机业务退出中国市场.并且据韩媒报道,LG还将会逐渐取消高端手机业务,也就是说未来V系列和 ...

  8. Python知识点总结及其介绍链接

    Python 弱引用(不会增加引用计数的引用,可以用来做对象缓存,避免循环引用导致内存无法回收):http://python.jobbole.com/85431/ from future import ...

  9. runR

    Linux下使用R 运行linux下的R脚本 编写R文件 新建后缀名为R的文件 写入R程序 在脚本首行加入 1 运行R文件 这里有两种方式 大专栏  runR进入R的环境">进入R的环 ...

  10. Machine-learning-DecisionTree

    前言 决策树是一种自上而下,对样本数据进行树形分类的过程,由结点和有向边组成.结点分为内部结点和叶结点,其中每个内部结点表示一个特征或属性,叶节点表示类别.从顶部根节点开始,所有样本聚在一起,经过根节 ...