什么是反射机制

这篇具有很好参考价值的文章主要介绍了什么是反射机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

反射

1.什么是类对象:
所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。

比方有一个Hero类:类对象就是用于描述这种类,都有什么属性,什么方法的。

获取类对象有3种方式

  1. Class.forName
  2. Hero.class
  3. new Hero().getClass()

在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。
注: 准确的讲是一个ClassLoader下,一种类,只会有一个类对象存在。通常一个JVM下,只会有一个ClassLoader。

2.获取类对象时 静态属性会被初始化 (除了直接使用 Class c = Hero.class 这种方式,这种方式不会导致静态属性被初始化)

public class TestReflection {

    public static void main(String[] args) {
        String className1 = "com.javaBasic.modelClass.Hero";
        /*
        *public class Hero {
             public String name;
             public float hp;
             public int damage;
             public int id;
         
             static String copyright;
         
             static {
                 System.out.println("初始化 copyright");
        copyright = "版权由Riot Games公司所有";
    }
}
        * */
        try {
            Class pClass3=new Student().getClass();
            Class pClass1=Class.forName(className1);
            Class pClass2=Hero.class;
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

通过反射创建对象

反射是创建对象的另一种方式,通过反射创建类对象后 获取构造器将其实例化后,还可以通过field修改属性,调用方法

public class TestReflection {

    public static void main(String[] args) {
        String className1 = "com.javaBasic.modelClass.Hero";

        try {
            Class pClass1=Class.forName(className1);
            Constructor constructor= pClass1.getConstructor();
            Hero hero= (Hero) constructor.newInstance();
            hero.name="通过反射创建类对象后 获取构造器将其实例化后的name";
            System.out.println(hero);

            Field f1= hero.getClass().getDeclaredField("name");
            f1.set(hero,"修改后的name字段");
            System.out.println(hero.name);

             // 获取这个名字叫做setName,参数类型是String的方法
            Method m = h.getClass().getMethod("setName", String.class);
            // 对h对象,调用这个方法
            m.invoke(h, "调用方法并set后的name");
            // 使用传统的方式,调用getName方法
            System.out.println(h.getName());

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

注:
getField和getDeclaredField的区别
这两个方法都是用于获取字段
getField 只能获取public的,包括从父类继承来的字段。
getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))


来一个实际一点的例子

public class Cat {
    private static String name;

    public Cat(){
        name="雷猫咪";
    }

    private void play1(){
        System.out.println("私有方法:和猫咪快乐的玩耍");
    }

    public void play2(){
        System.out.println("公有方法:带着猫咪出去逛街");
    }
}

public class Test {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException {

        Class reflect = Class.forName("com.example.javacore.reflection.demo1.Cat");

        String name = reflect.getName();


        System.out.println("获取到类名:"+name);

        //动态创建类的对象

        Object object = reflect.getConstructor().newInstance();

        //调用方法

        Method method = reflect.getDeclaredMethod("play1");
        //注意这里是一个私有方法 所以设置其可访问性
        method.setAccessible(true);
        method.invoke(object);


    }
}

获取到类名:com.example.javacore.reflection.demo1.Cat
私有方法:和猫咪快乐的玩耍

反射有什么用?

反射的用处很多 在框架中使用的比较广泛 java框架的很多便捷功能 它的底层实现往往都有放射的影子

比如:通常在Dao框架中,save方法都是泛型参数
save(T t)
save(People people)
save(User user)
为什么我们不管放什么对象都能保存到数据库呢
不管中间走了多少路 最后还是要执行这条语句的 insert into tablename values
问题的关键就是如何生成这个SQL 这就需要反射 取得这个类对应的信息 然后去找对应的数据库表了

(看到这也能明白注解是什么用的了,注解其实就是class中的一些元数据信息,比如类的元数据信息,字段的元数据信息,这样在反射的时候可以拿到类到底对应的数据库中的哪个字段,哪个表名,这样才能生成正确的SQL)文章来源地址https://www.toymoban.com/news/detail-449449.html

到了这里,关于什么是反射机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java笔记040-反射/反射机制、Class类

    目录 反射(reflection) 一个需求引出反射 反射机制 Java反射机制原理图 Java反射机制可以完成 反射相关的主要类 反射机制的优点和缺点 反射调用优化-关闭访问检查 Class类 基本介绍 代码解释部分 类加载方法 应用实例:Class02.java 获取Class类对象 代码解释部分 哪些类型有Class对象

    2024年02月09日
    浏览(49)
  • Java反射、代理机制

    官方解释:反射允许对封装类的字段、方法和构造方法的信息进行编程访问。 虚拟机加载类文件后,会在方法区生成一个类对象,包含了类的结构信息,如字段、方法、构造方法等。反射是一种能够在程序运行时动态访问、修改类对象中任意属性的机制(包括private属性)。

    2024年02月10日
    浏览(49)
  • Java反射机制深入详解

    一.概念 反射就是把Java的各种成分映射成相应的Java类。 Class类的构造方法是private,由JVM创建。 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示

    2024年02月06日
    浏览(45)
  • Java的反射机制(2)

    目录 Class类基本介绍 Class类的常用方法 如何获取class类对象 哪些类型有Class对象 Class类基本介绍 在Java语言中,每个对象都有一个运行时类,即其所属的类。而这个运行时类在Java中是以Class类的实例形式存在的,该Class类实例就是所谓的Class对象。Class类表示一个类或接口的元

    2024年02月08日
    浏览(39)
  • C#的反射机制

    当谈到C#的反射机制时,它提供了一种 动态 地在运行时获取和操作类型信息的能力。通过反射,可以 在编译时未知的情况下 ,使用类型信息来创建对象、调用方法、访问属性和字段等。下面是一些反射机制的重要概念和用法: Type 类型:Type 类型表示在代码中定义的类型(

    2024年02月10日
    浏览(53)
  • Java的反射机制

    Java 的反射机制允许在程序运行期间,借助反射 API 获取类的内部信息,并能直接操作对象的内部属性及方法。 Java 反射机制提供的功能: 在运行时,使用反射分析类的能力,获取有关类的一切信息(类所在的包、类实现的接口、标注的注解、类的数据域、类的构造器、类的

    2024年02月02日
    浏览(42)
  • C# 反射机制详解

    Reflection,中文翻译为反射。 这是.Net中获取运行时类型信息的方式。 官方定义: 审查元数据并收集关于它的类型信息的能力。 元数据(编译以后的最基本数据单元) 就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义

    2024年02月07日
    浏览(45)
  • 反射机制-体会反射的动态性案例(尚硅谷Java学习笔记)

    // 举例01 public class Reflect{ } 案例:榨汁机榨水果汁,水果分别有果(com.reflect.Apple)、香蕉(Banana)、桔子(Orange)等。 效果如图。 提示: 1、声明(Fruit)水果接口,包含榨汁抽象方法: void squeeze(); /skwi:z/ 2、声明榨汁机(Juicer),包含运行方法: public void run(Fruit f),方法体中,调用f的榨汁方

    2024年02月11日
    浏览(47)
  • Golang 关于反射机制(一文了解)

    前言: Golang 反射比 C++ RTTI 要强大的多,但是比 .NET C#/VB/C++ 来说,它大约属于低阶反射支持的范畴。 但是 Golang 语言提供了相对强大的反射。 它总要比没有提供易用反射支持的要好的多,C++ 之中我们基本只能依赖模板、宏通过元编程来实现相对强大的反射机制。 Golang 反射

    2024年01月23日
    浏览(43)
  • 【JavaSE】Java的反射机制

    1.java反射机制 1.1简介 被视为动态语言的关键,允许程序在执行期间,借助于RefectionAPI取得任何类的内部信息。在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个类对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方

    2024年04月26日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包