反射 p5 反射相关使用和暴破

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

反射相关使用和暴破

通过反射创建对象

  1. 方式一:调用类中的public修饰的无参构造器;
  2. 方式二:调用类中的指定构造器;
  3. Class类相关方法:
    • newInstance():调用类中的无参构造器,获取对应类的对象;
    • getConstructor(Class...clazz):根据参数列表,获取对应的public构造器对象;
    • getDecalaredConstructor(Class...clazz):根据参数列表,获取对应的所有构造器对象;
  4. Constructor类相关方法:
    • setAccessible():暴破;
    • newInstance(Object...obj):调用构造器;

代码演示:文章来源地址https://www.toymoban.com/news/detail-603061.html

package com.hspedu.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author: 86199
 * @date: 2023/6/5 20:32
 * @description: 演示通过反射机制创建实例
 */
public class ReflectCreateInstance {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //先获取User类的Class对象
        Class<?> userClass = Class.forName("com.hspedu.reflection.User");
        //1. 通过public无参构造器构造实例
        Object user = userClass.newInstance();
        System.out.println("user = " + user);
        //2. 通过public有参构造器构造实例
        /*
            此时 constructor 对象就是这个构造器
            public User(String name){//public 的有参构造器
                this.name = name;
            }
         */
        //先得到对应的构造器
        Constructor<?> constructor = userClass.getConstructor(String.class);
        //创建实例,传入实参
        Object user1 = constructor.newInstance("小花");
        System.out.println("user1 = " + user1);

        //3. 通过非public有参构造器构造实例
        //先得到对应的private构造器
        Constructor<?> declaredConstructor = userClass.getDeclaredConstructor(String.class, int.class);
        //创建实例
        declaredConstructor.setAccessible(true);//暴破【暴力破解】,使用反射可以访问private构造器/方法/属性,反射面前,都是纸老虎
        Object user2 = declaredConstructor.newInstance("小黑", 20);
        System.out.println("user2 = " + user2);
    }
}

class User{//User类
    //属性
    private String name = "大黄";
    private int age = 10;

    public User() {//无参构造器
    }

    public User(String name){//public 的有参构造器
        this.name = name;
    }
    private User(String name, int age) {//private 有参构造器
        this.name = name;
        this.age = age;
    }

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

/*运行结果
user = User [ age = 10, name = 大黄 ]
user1 = User [ age = 10, name = 小花 ]
user2 = User [ age = 20, name = 小黑 ]
*/

通过反射访问类中成员

访问属性

  1. 根据属性名获取Field对象

    Field f = clazz对象.getDeclaredField(属性名);//获取所有

    Field f = clazz对象.getField(属性名);//获取公有

  2. 暴破:f.setAccessible(true)//f 是Field

  3. 访问

    f.set(o, 值) //o 表示本类的对象
    System.out.println(f.get(o));//o 表示对象
    
  4. 注意:如果是静态属性,则set和get中的参数o,可以写成null;

代码演示:

package com.hspedu.reflection;

import java.lang.reflect.Field;

/**
 * @author: 86199
 * @date: 2023/6/5 21:37
 * @description: 演示反射操作属性
 */
public class ReflectAccessProperty {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        //得到Student类对应的Class对象
        Class<?> stuClass = Class.forName("com.hspedu.reflection.Student");
        //创建对象
        Object o = stuClass.newInstance();//o 的运行类型就是Student
        System.out.println(o.getClass());//class com.hspedu.reflection.Student

        //1. 使用反射得到age属性对象
        Field age = stuClass.getField("age");//拿到公有的
        age.set(o, 88);//通过反射操作属性
        System.out.println(o);
        System.out.println(age.get(o));//返回age的值

        //2. 使用反射操作name属性
        Field name = stuClass.getDeclaredField("name");
        name.setAccessible(true);//对name进行暴破,可以操作私有属性
        //name.set(o, "大黑");
        name.set(null, "大白");//因为name是static修饰的,所以这里 o 也可以写成 null
        System.out.println(o);
        System.out.println(name.get(o));//获取属性值
        System.out.println(name.get(null));//只有静态的才能这样用
    }
}
class Student{//类
    public int age;
    private static String name;

    public Student() {
    }

    @Override
    public String toString() {
        return "Student [ " +
                "age = " + age + " name = " + name +
                ']';
    }
}
/*	运行结果
class com.hspedu.reflection.Student
Student [ age = 88 name = null]
88
Student [ age = 88 name = 大白]
大白
大白
*/

访问方法

  1. 根据方法名和参数列表获取Method方法对象:

    Method m = clazz.getDeclaredMethod(方法名, XX.class);//得到本类的所有方法

    Method m = clazz.getMethod(方法名, XX.class);//得到本类的public方法

  2. 暴破:m.setAccessible(true);

  3. 访问:Object returnVal = m.invoke(o, 实参列表);//o就是本类的对象

  4. 注意:如果是静态方法,则invoke的参数o,可以写成null;

代码演示:

package com.hspedu.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author: 86199
 * @date: 2023/6/5 21:56
 * @description: 演示通过反射调用方法
 */
public class ReflectAccessMethod {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException {
        //获取Boss类的Class对象
        Class<?> bossCls = Class.forName("com.hspedu.reflection.Boss");
        //创建对象
        Object o = bossCls.newInstance();
        //1. 调用public 的 hi 方法
        //得到hi方法对象
//        Method hi = bossCls.getMethod("hi", String.class);//OK
        Method hi = bossCls.getDeclaredMethod("hi", String.class);//OK
        hi.invoke(o, "大黄!");
        //2. 调用private的say方法
        //得到say方法对象
        Method say = bossCls.getDeclaredMethod("say", int.class, String.class, char.class);
        //因为say方法私有,所以需要先暴破
        say.setAccessible(true);
        System.out.println(say.invoke(o, 20, "张三", '男'));

        //3. 因为say方法是static,所以可以这样调用
        System.out.println(say.invoke(null, 18, "李四", '女'));

        //返回值,在反射中如果方法有返回值统统返回Object,但是运行类型和方法定义的返回类型相同
        //如果返回类型是void,返回null也是Object类型
        Object reVal = say.invoke(null, 23, "王五", '男');
        System.out.println("reVal的运行类型" + reVal.getClass());
    }
}

class Boss{//类
    public int age;
    private static String name;

    public Boss() {//构造器
    }

    private static String say(int n, String s, char c){//静态方法
        return n + " " + s + " " + c;
    }

    public void hi(String s){//普通方法
        System.out.println("hi " + s);
    }
}

/* 运行结果
hi 大黄!
20 张三 男
18 李四 女
reVal的运行类型class java.lang.String
*/

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

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

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

相关文章

  • Go语言之反射(反射的简单使用,原理)

    1.什么是反射 Go语言中,反射的机制就是在运行的时候,可以获取到其变量的类型和值,且可以对其类型和值进行检查,对其值进行修改。 即在不知道具体的类型的情况下,可以用反射机制来查看变量类型、更新变量的值。 Go中反射主要涉及到两个概念:Type和Value。对所有的

    2023年04月25日
    浏览(27)
  • C#反射的学习,反射的一些注意事项,反射的一些使用代码的实例

    本文档写的的是C#中的反射常用的方式(附带示例代码)以及在使用的时候的一些注意事项。 C#中的反射是一种强大的机制,它允许在运行时动态地检查、访问和操作程序的元数据、类型信息和对象。以下是C#中反射常用的技巧和使用方式: 获取类型信息:使用Type类可以获取

    2024年02月06日
    浏览(40)
  • Java 中反射的概念、作用和特点,在什么情况下使用反射及使用实例

    反射(Reflection)是 Java 的一种特性,它可以让程序在运行时获取自身的信息,并且动态地操作类或对象的属性、方法和构造器等。通过反射功能,可以让我们在不知道具体类名的情况下,依然能够实例化对象,调用方法以及设置属性。 反射的作用有以下几点: 运行时探查类

    2024年02月06日
    浏览(37)
  • 4,链表【p5】

    使用哈希表,时间复杂度被认为是常数级别O(N) 哈希表在使用层面上可以理解为一种集合结构 如果只有key,没有伴随数据value,可以使用HashSet结构(C++中叫UnOrderedSet / UnSortedSet) 如果既有key,又有伴随数据value,可以使用HashMap结构(C++中叫UnOrderedMap / UnSortedMap) 有无伴随数据,是

    2024年02月14日
    浏览(24)
  • 反射的作用( 越过泛型检查 和 可以使用反射保存所有对象的具体信息 )

    反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时是可以 为集合存入其他任意类型的元素的 。 泛型只是在编译阶段可以约束集合只能操作某种数据类型,在 编译成Class文件进入 运行阶段 的时候,其真实类型都是不带泛型的集合,泛型相当于被擦除了。

    2024年02月08日
    浏览(33)
  • Java 反射使用大全

    好多年前自己记的关于 Java 反射的笔记,这么些年下来,自己用到反射的时候就看这一份就够了。 但是笔记以文件形式存放不方便,所以将其放到 CSDN 中,也希望能给更多小伙伴带来帮助。 Java 程序中的各个 Java 类属于同一种事物,描述这类事物的 Java 类名就是 Class 人 - Per

    2024年02月07日
    浏览(21)
  • Java 反射浅析与使用

    加载class的方式 通过Class.forName(className) className:全类名(类包名+类名) 通过类名.class方法获取 通过对象的getClass()方法获取 获取构造函数的方法 getConstructors() 返回该类声明的所有公共构造函数 getDeclaredConstructors() 返回该类声明的所有构造函数 getConstructor(Class?… parameterTypes) 返

    2024年02月03日
    浏览(25)
  • p5.js 视频播放指南

    在刚接触 p5.js 时我以为这只是一个艺术方向的 canvas 库,没想到它还支持视频文件和视频流的播放。 本文简单讲讲如何使用 P5.js 播放视频。 p5.js 除了可以使用 video 元素播放视频外,还支持使用 image 控件播放视频。 基础用法 p5.js 的 createVideo() 方法可以创建一个 video 元素。

    2024年02月08日
    浏览(26)
  • Servlet p5 Cookie对象

    Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于Cook是服务器端保存在客户端的信息,所以其安全性也

    2024年02月11日
    浏览(39)
  • Java重点:反射机制的使用

    目录 一、概念 二、类类 1、类类的获取方式 1)类名.Class 2)对象.getClass() 3)Class.forName() 三、反射实例化 1、调用一个公有的无参构造方法 2、调用一个公有的一个参构造方法 3、调用一个公有的两个参构造方法 4、调用一个私有的一个参构造方法 四、反射:方法调用 1、公有

    2024年02月07日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包