反射全面详解

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

Java源码系列:下方连接
http://t.csdn.cn/Nwzed



前言


一、反射是什么?

反射全面详解

package tanchishell.reflection;

import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionSource {
    public static void main(String[] args) throws Exception{

        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));

        String classfullpath = (String) properties.get("classfullpath");
        String methodName = (String)properties.get("method");

        System.out.println(classfullpath +"===" +methodName);
        //使用反射生成对象

        Class<?> aClass = Class.forName(classfullpath);

        //拿到class调用方法创建实例
        Object o = aClass.newInstance();

        //打印 o 的运行时类型
        System.out.println("o的类型是==="+ o.getClass());
        Cat cat = (Cat) o;
        System.out.println(""+ cat);

        //使用反射调用方法
        Method method = aClass.getMethod(methodName);
        method.invoke(cat);
        //方法调用对象
        System.out.println("======"+method);


    }
}

Catpackage tanchishell.reflection;

public class Cat {

    private String name="招财狗";

//    public Cat(String name) {
//        this.name = name;
//    }

    public void hi(){
        System.out.println("你好"+name);
    }
    public void hello(){
        System.out.println("很不好"+name);
    }
}





配置文件
classfullpath=tanchishell.reflection.Cat
method=hello


反射全面详解

反射全面详解

反射全面详解
反射全面详解

反射全面详解

//更详细的代码

public class Cat {

    private String name="招财狗";
    public String catName="招财猫";



    public Cat() {
    }

    public Cat(String name) {
        this.name = name;
    }

    public Cat(String name,String catName) {
        this.name = name;
        this.catName = catName;
    }

    public void hi(){
        System.out.println("你好"+name);
    }
    public void hello(){
        System.out.println("很不好"+name);
    }
}



//反射获取所有基本属性


package tanchishell.reflection;

import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionSource {
    public static void main(String[] args) throws Exception{

        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));

        String classfullpath = (String) properties.get("classfullpath");
        String methodName = (String)properties.get("method");

        System.out.println(classfullpath +"===" +methodName);
        //使用反射生成对象

        Class<?> aClass = Class.forName(classfullpath);

        //拿到class调用方法创建实例
        Object object = aClass.newInstance();

        //打印 o 的运行时类型
        System.out.println("o的类型是==="+ object.getClass());
        Cat cat = (Cat) object;
        System.out.println(""+ cat);

        //使用反射调用方法
        Method method = aClass.getMethod(methodName);
        method.invoke(cat);
        //方法调用对象
        System.out.println("方法调用对象======"+method);

        //使用反射获取成员变量  getField不能获取私有属性和受保护的属性,只能获取public
        Field cat1 = aClass.getField("catName");
        cat1.get(object);//反射反过来调用方法。是方法调用对象
        System.out.println("反射获取成员属性"+cat1);

        //使用反射获取构造器,默认获取无参
        Constructor<?> constructor = aClass.getConstructor();
        System.out.println("默认获取无参"+constructor);
        //获取有参
        Constructor<?> stringConstructor = aClass.getConstructor(String.class);
        System.out.println("获取有参"+stringConstructor);
        //获取双参
        Constructor<?> SSConstructor = aClass.getConstructor(String.class,String.class);
        System.out.println("获取双参"+SSConstructor);

        /**
         * 获取构造器后还可以通过构造器创建对象
         */
    }
}




二、反射机制的优化

反射全面详解
反射全面详解

三、Class类

同一个类只会通过类加载器加载一次,如果使用传统的 new 方式创建对象,在使用反射的方式就不会进行类加载了。
反射全面详解

反射全面详解
反射全面详解

反射全面详解
反射全面详解

三、获取Class对象的六种方式

反射全面详解
反射全面详解
反射全面详解

反射全面详解

反射全面详解
反射全面详解

哪些类有Class对象

反射全面详解

反射全面详解

四、类的加载

动态和静态加载

反射全面详解

反射全面详解
反射全面详解

类的加载流程

反射全面详解
反射全面详解
加载和连接阶段是由jvm虚拟机控制的,初始化程序员可以写在类中。

反射全面详解

加载阶段

反射全面详解

连接阶段

反射全面详解
在准备阶段只是对成员变量进行默认初始化,而在初始化阶段才会对成员变量进行赋值。
反射全面详解
反射全面详解
反射全面详解

初始化阶段

反射全面详解
反射全面详解
反射全面详解
反射全面详解
反射全面详解
反射全面详解

五、通过反射获取类的结构信息

反射全面详解
反射全面详解
反射全面详解
反射全面详解

反射全面详解

六、反射爆破实例

反射全面详解

反射全面详解

反射暴力破解创建类的实例

package tanchishell.reflection;

import java.lang.reflect.Constructor;

/**
 * 反射爆破对象
 */
public class ReflectionTest {
    public static void main(String[] args) throws  Exception{
        //1、先获取 User 类的 Class对象
        Class<?> userClass = Class.forName("tanchishell.reflection.User");
        //2、通过午餐狗杂创建实例
        Object user = userClass.newInstance();
        System.out.println(user);
        //3、获取public有参构造创建实例

        //获取有参构造器
        Constructor<?> constructor = userClass.getConstructor(String.class);
        Object hello = constructor.newInstance("hello");
        System.out.println(hello);

        //4、通过私有的有参构造创建实例
        Constructor<?> declaredConstructor = userClass.getDeclaredConstructor(int.class, String.class);
        //爆破私有构造
        declaredConstructor.setAccessible(true);
        Object no = declaredConstructor.newInstance(20, "很不好");
        System.out.println(no);


    }
}

class User{
    private int age = 10;
    private String name = "你好";

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    private User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

反射爆破访问成员属性

反射全面详解

package tanchishell.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * 反射爆破对象
 */
public class ReflectionTest {
    public static void main(String[] args) throws  Exception{
        //1、先获取 User 类的 Class对象
        Class<?> userClass = Class.forName("tanchishell.reflection.User");
        //2、通过午餐狗杂创建实例
//        Object user = userClass.newInstance();

        //通过无参构造创建实例,并爆破
        Constructor<?> constructor = userClass.getConstructor();
        constructor.setAccessible(true);
        Object user = constructor.newInstance();
        System.out.println(user);


        //2 通过反射获取属性

        //获取所有public属性
        Field[] fields = userClass.getFields();
        for (int i = fields.length - 1; i >= 0; i--) {
            Field field = fields[i];
            field.setAccessible(true);
            System.out.println(field);
            field.set(user,60);
            System.out.println(user);
        }

        //获取public属性,并赋值  调用这个方法属性必须是 public
        Field age = userClass.getField("age");
        age.setAccessible(true);
        System.out.println(age);
        age.set(user,100);
        System.out.println(user);

        //获取任意属性 但静态属性和私有属性不能赋值  IllegalAccessException 需要爆破
        Field name = userClass.getDeclaredField("name");
        name.setAccessible(true);
        System.out.println(name);
        name.set(user,"不是如风");
        System.out.println(user);

        //获取任意属性的值,也需要先进行爆破
        System.out.println(name.get(user));
        System.out.println(age.get(user));

    }
}

class User{
    public int age = 10;
    private  String name = "你好";

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    private User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

反射爆破访问方法

反射全面详解
反射全面详解文章来源地址https://www.toymoban.com/news/detail-404473.html

package tanchishell.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射爆破对象
 */
public class ReflectionTest {
    public static void main(String[] args) throws  Exception{
        //1、先获取 User 类的 Class对象
        Class<?> userClass = Class.forName("tanchishell.reflection.User");
        //2、通过午餐狗杂创建实例
//        Object user = userClass.newInstance();

        //通过无参构造创建实例,并爆破
        Constructor<?> constructor = userClass.getConstructor();
        constructor.setAccessible(true);
        Object user = constructor.newInstance();
        System.out.println(user);


        //2 通过反射获取方法  getMethod("hi",String.class); 一定要注意
        Method method = userClass.getMethod("hi",String.class);
        method.invoke(user,"钢铁侠");

        //3、通过反射获取任意方法 私有方法需要爆破
        Method hello = userClass.getDeclaredMethod("hello", int.class,String.class);
        hello.setAccessible(true);
        hello.invoke(user,10,"钢铁侠");


    }
}

class User{
    public int age = 10;
    private  String name = "你好";


    public void hi(String name){
        System.out.println("你好!" +name);
    }

    private void hello(int age,String name){
        System.out.println("你好!" +name+"我——" +age +"岁了");
    }

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    private User(int age) {
        this.age = age;
    }

    private  User(int age, String name) {
        this.age = age;
        this.name = name;
    }
    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

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

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

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

相关文章

  • Spring源码系列(补充):详解ApplicationContext

    在之前的文章中,我们已经对Spring源码中的一些核心概念进行了分析。由于篇幅限制,我们并没有详细解释ApplicationContext类所继承的父接口及其作用。因此,本文将单独为ApplicationContext进行详细说明,包括其继承的父接口及其作用。 大家应该都比较熟悉MessageSource,它用于国

    2023年04月21日
    浏览(40)
  • CSDN首发 | 《深入浅出OCR系列》目录

    👨‍💻 作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨ 公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️ 点击链接 加群。 🎉 专栏推

    2023年04月08日
    浏览(57)
  • 【Spark原理系列】Accumulator累加器原理用法示例源码详解

    源自专栏《SparkML:Spark ML系列专栏目录》 Accumulator是Spark中的一种分布式变量,用于在并行计算中进行累加操作。它是由MapReduce模型中的“全局计数器”概念演化而来的。 Accumulator提供了一个可写的分布式变量,可以在并行计算中进行累加操作。在Spark中,当一个任务对Accum

    2024年03月14日
    浏览(62)
  • 【YOLO系列】YOLOv5超详细解读(源码详解+入门实践+改进)

    吼吼!终于来到了YOLOv5啦! 首先,一个热知识:YOLOv5没有发表正式论文哦~ 为什么呢?可能YOLOv5项目的作者Glenn Jocher还在吃帽子吧,hh 前言 一、YOLOv5的网络结构  二、输入端 (1)Mosaic数据增强 (2)自适应锚框计算 (3)自适应图片缩放 三、Backbone (1)Focus结构 (2)CSP结构

    2024年02月07日
    浏览(47)
  • CloudFlare系列--使用第三方来自定义CSDN的IP(蓝精灵)

    原文网址:CloudFlare系列--使用第三方来自定义CSDN的IP(蓝精灵)_IT利刃出鞘的博客-CSDN博客 说明 本文介绍CloudFlare的CDN如何自定义第三方IP。 概述 CloudFlare官网接入域名的方式只能是 NS 接入,这样默认DNS服务器只能改为CloudFlare的DNS服务器。而第三方(Cloud Flare Parnter)支持CNAME/

    2024年02月09日
    浏览(47)
  • 【测试开发】python系列教程:python反射

    这次我们分享python的反射 在java中大家都知道,java的反射的机制,其实在python中也是有反射机制的,我们看下如何 来用? 一、什么是反射? 程序可以访问、检测和修改\\\'本身状态\\\'或者行为的一种能力。大白话:其实就是通过字符串操作对象的数据和方法 二、反射的作用 正常

    2024年02月05日
    浏览(49)
  • Java反射源码学习之旅

    前段时间组内针对“拷贝实例属性是应该用BeanUtils.copyProperties()还是MapStruct”这个问题进行了一次激烈的battle。支持MapStruct的同学给出了他嫌弃BeanUtils的理由:因为用了反射,所以慢。 这个理由一下子拉回了我遥远的记忆,在我刚开始了解反射这个Java特性的时候,几乎看

    2024年02月11日
    浏览(54)
  • Reflection java反射源码分析

    Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种 动态获取程序信息 以及 动态调用对象的功能 称为Java语言的反射机制。反

    2024年02月02日
    浏览(46)
  • APT 系列 (一):APT 筑基之反射

    什么是反射? 简单来讲,反射就是:已知一个类,可以获取这个类的所有信息 一般情况下,根据面向对象封装原则,Java实体类的属性都是私有的,我们不能获取类中的属性。但我们可以根据反射,获取私有变量、方法、构造方法,注解,泛型等等,非常的强大 注意:Googl

    2024年02月11日
    浏览(33)
  • 【Spark ML系列】Frequent Pattern Mining频繁挖掘算法功能用法示例源码论文详解

    挖掘频繁项、项集、子序列或其他子结构通常是分析大规模数据集的首要步骤,在数据挖掘领域已经成为一个活跃的研究课题。我们建议用户参考维基百科上关于关联规则学习的相关信息。 FP-growth算法在《Han et al., Mining frequent patterns without candidate generation》一文中进行了描述

    2024年02月19日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包