今天本人给大家讲解一下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. considerate|considerable|content|Contact|Consult|deceived|

    ADJ-GRADED 替人着想的;体贴的Someone who is considerate pays attention to the needs, wishes, or feelings of o ...

  2. 关于使用css变量实现主题的切换效果

    现在要实现网页主题的切换成本较小的一种方案就是使用css的变量来实现 HTML 在HTML的body标签上先定义一个id元素属性 <body id="sm-theme"> ...

  3. Markdown 内嵌 HTML 语法

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.Markdown内嵌HTML,本文总结了一些常用的HTML标记用于扩展Markdow ...

  4. 吴裕雄--天生自然python编程:实例(2)

    list1 = [10, 20, 4, 45, 99] list1.sort() print("最小元素为:", *list1[:1]) list1 = [10, 20, 1, 4 ...

  5. win7图片只显示图标不显示预览图解决方案

    问题描述: win7上图片只显示图标,不显示缩略图:不管是调节小图.中图还是大图或者其他均不显示:而且这种情况下使用截图工具截下来的图片都不自动带上扩展名:情况如下图: 解决方案: 打开计算机-> ...

  6. 解决android 无法打开 DDMS 中的data目录

    把上面操作一遍就可以了,如果还是不行你可以检查下 su 是不是输入错误了.

  7. derby常用语法

    derby常用语法 以user表为例: 1.创建表 create table user (id int primary key,account varchar(5),name varchar(5),p ...

  8. js javascript 获取url,获得当前页面的url,静态html文件js读取url参数

    获得当前页面的url window.location.href 静态html文件js读取url参数 location.search; //获取url中"?"符后的字串 下边为转载的 ...

  9. nginx: [emerg] unknown directive “ ” in /usr/local/nginx/conf/vhost/XXX.conf:53报错处理

    开发同事发给我一小段nginx配置,加到服务器上之后,执行nginx -s reload时,出现报错: nginx: [emerg] unknown directive “ ” in /usr/loc ...

  10. C++走向远洋——41(深复制体验,3,)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...