Java的反射基础技术

今天本人给大家讲解一下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的反射基础讲解完毕,又不懂或者不理解的可以在评论区给本人留言,我会及时回复大家的。

原文地址:https://www.cnblogs.com/mumu555/p/12528443.html

时间: 2024-10-09 17:20:04

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

Java:反射基础

Java:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识.这个对象追踪着每个对象所属的类.虚拟机利用运行时类的信息选择相应的方法执行. 我们可以通过专门的Java类访问这些信息.保存这些信息的类称为Class. 根据对象获得类信息: MyClass myClass; ..... Class cl = myClass.getClass(); cl.get

java的反射基础入门

1.获取反射Class类的方式 Class.forName("全类名"): 类名.class//需要在JVM已加载的前提下 对象.getClass 2.java对javabean进行操作的四种方式 public class Descriptor { public static void main(String[] args) throws Exception { // 方式1 PropertyDescriptor descriptor = new PropertyDescriptor(

黑马程序员-java基础-反射基础

------- android培训.java培训.期待与您交流! ---------- java的反射机制是java的特性之一,反射机制是构建框架技术的基础所在,使用反射可以使程序更加灵活,避免将程序写死在代码里.相对于很多初学者只接触过java基础的人,反射还是一个很朦胧难懂的概念,下面我们就来说一下反射的一些应用. java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能.java反射有3个动态性质:1.运行时生成对象实例,2.运行期间调用发放,3.运行时更改属性. 那么反射

Java反射基础笔记

由于工作中发现自己的基础知识掌握的并不是很牢固,遇到的问题与学习的东西也没有很好的做过记录,导致再遇到时耗费大量时间上网搜索,所以决定串下基础知识并尽量形成记录,方便自己之后遗忘时查询,也方便各位有需求的伙伴翻阅查看,大家共同探讨.学习. 本次梳理的是Java反射的基础,该系列为笔者学习慕课反射讲解视频的学习笔记,尽可能全的记录,以帮助初学者快速掌握反射基础知识,如需转载该系列请注明原文链接. 一.反射之Class类的使用 二.反射之获取方法信息 更多编辑中 --

JAVA中的糕富帅技术——反射(一)

前言 突然发现好久没写博客了,前面写的都是关于Android的东西,今天心血来潮突然有一种冲动想写一篇基于JAVA技术的博客,别问我为什么?有钱.任性! 今天就来谈谈反射机制:学过JAVA的人不一定懂得反射,但是一定听说过反射,不过也仅仅是听说过而已:因为反射用的地方也不会那么多,但是反射用的妙经常会解决我们挠破头皮的大问题.至于诸如为什么叫做反射.而不叫做正射倒射此类的历史问题,还是交给历史学家去研究吧... 反射的基石 在谈反射之前,我们应该先了解下类的概念来引入.类是一种抽象的概念,举个例

java反射基础知识(一)

一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.对于反射的操作实际上就是通过Class对象获取: *a.java.lang.reflect.Field:提供有关类或接口的单个

java反射基础知识(二)

1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值,即使方法或属性是私有的的也可以通过反射的形式调用,这种"看透 class"的能力被称为内省,这种能力在框架开发中尤为重要. 有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运

java反射基础知识(四)反射应用实践

反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类. 通过getClass方法 在Java中,每一个Object都有一个getClass()方法,通过getClass方法我们可以获取到这个对象对应的反射类: 1 2 String s = "ziwenxie"; Class

java笔记--反射机制之基础总结与详解

一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象. 它提供了在运行时检查对象属性的方法,这些属性包括它的成员和类型信息. 更重要的是Class对象是所有反射API的入口. Class类是泛型类,可以使用@SuppressWarnings("unchecked")忽略泛型或者使用Class<V>类型. 获得Class对象的5种