Java安全-01反射

简介: Java安全-01反射

5992ca2bcc7fc6f9f27b2a39b0d9f1e3_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg


知识基础



  • 对象
  • 构造方法
  • 重载
  • 单例模式

动态加载


JVM在执行的时候,并不是一次性把所有的class加载到内存中的,而是用到谁加载谁。


反射的概述


https://www.cnblogs.com/tech-bird/p/3525336.html

Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法


获取class对象的三种方式


  1. class.forName("全类名")
  2. 类名.class
  3. 对象.getClass(),如果上下文存在某个实例对象,可以通过getClass获取他的类
public class re {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class cls1 = Class.forName("demo.Person");
        Class cls2 = Person.class;
        Person person = new Person();
        Class cls3 = person.getClass();
        System.out.println(cls1);
        System.out.println(cls2);
        System.out.println(cls3);
        System.out.println(cls1==cls2);
        System.out.println(cls3==cls2);
}

feadef650f7404b26649c3640b491dee_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


类“初始化”执行顺序是什么


package demo;
public class test {
    public static void main(String[] args) {
        Ref ref = new Ref();
    }
}
class Ref{
    static {
        System.out.println("最先执行\r\n");
    }
    {
        System.out.println("第二执行\r\n");
    }
    public Ref(){
        System.out.println("最后执行\r\n");
    }
}

33b2776abff87e375fafc5c9a9bd5782_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


demo1


package demo;
public class test {
    public static void main(String[] args) throws ClassNotFoundException {
        Class.forName("demo.CalcDemo");
    }
}
class CalcDemo {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            Process pc = rt.exec("calc");
            pc.waitFor();
        } catch (Exception e) {
        }
    }
}


96471e9ecf05f779a7923fd4465b9032_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


Class方法


获取变量

  • Field getField(name):根据字段名获取某个public的field(包括父类)
  • Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
  • Field[] getFields():获取所有public的field(包括父类)
  • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)


cls3.getField("aaa");//指定名称的public修饰的
cls3.getFields();//获取所有public修饰的成员变量
cls3.getDeclaredField("aaaa");//获取所有
cls3.getDeclaredFields();

获取构造方法

cls3.getConstructors();
cls3.getConstructor("aaa");
cls3.getDeclaredConstructor("bbb");
cls3.getDeclaredConstructors();


package demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//        Ref ref = new Ref();
        Class cls = Class.forName("demo.Person");
        Constructor constructor = cls.getConstructor();
        Constructor constructor1 = cls.getConstructor(String.class);
        constructor.newInstance();
        constructor1.newInstance("jl");
    }
}

9b4d25ddee6f8445ef000f5b966008f7_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


demo2

package demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
public class test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class cls = Class.forName("java.lang.ProcessBuilder");
        Method methodStart = cls.getMethod("start");
        Constructor constructor = cls.getConstructor(List.class);
        Object obj =  constructor.newInstance(Arrays.asList("calc.exe"));
        methodStart.invoke(obj);
    }
}

327422c226b7464cb80941d35effb844_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


demo3-可变长参数



package demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
public class test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class cls = Class.forName("java.lang.ProcessBuilder");
        Method methodStart = cls.getMethod("start");
        Constructor constructor = cls.getConstructor(String[].class);
        Object obj = constructor.newInstance(new String[][]{{"calc.exe"}});
        methodStart.invoke(obj);
    }
}


获取成员方法

cls3.getConstructors();
cls3.getConstructor("aaa");
cls3.getDeclaredConstructor("bbb");
cls3.getDeclaredConstructors();

demo4



package demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//        Ref ref = new Ref();
        Class cls = Class.forName("demo.Person");
        Constructor constructor = cls.getConstructor();
        Constructor constructor1 = cls.getConstructor(String.class);
        constructor.newInstance();
        constructor1.newInstance("jl");
    }
}



demo5



package demo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class cls = Class.forName("java.lang.Runtime");
        Method method = cls.getMethod("exec", String.class);
        Method method1 = cls.getMethod("getRuntime");
        method.invoke(method1.invoke(cls),"calc.exe");
    }
}

Runtime类就是单例模式,我们只能通过 Runtime.getRuntime() 来获取到 Runtime 对象。

0c06fd63a8145be645318120243f10eb_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


相关文章
|
16天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
34 4
|
30天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
21 0
[Java]反射
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
65 9
Java——反射&枚举
|
1月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
26 2
|
1月前
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
安全 Java API
java安全特性
java安全特性
29 8
|
1月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
16 0
|
2月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
68 11
|
2月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
下一篇
无影云桌面