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


相关文章
|
15天前
|
存储 安全 Java
解锁Java并发编程奥秘:深入剖析Synchronized关键字的同步机制与实现原理,让多线程安全如磐石般稳固!
【8月更文挑战第4天】Java并发编程中,Synchronized关键字是确保多线程环境下数据一致性与线程安全的基础机制。它可通过修饰实例方法、静态方法或代码块来控制对共享资源的独占访问。Synchronized基于Java对象头中的监视器锁实现,通过MonitorEnter/MonitorExit指令管理锁的获取与释放。示例展示了如何使用Synchronized修饰方法以实现线程间的同步,避免数据竞争。掌握其原理对编写高效安全的多线程程序极为关键。
37 1
|
23天前
|
安全 Java 测试技术
day26:Java零基础 - 反射
【7月更文挑战第26天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
23 5
|
1月前
|
IDE Java 测试技术
Java进阶之反射
【7月更文挑战第14天】Java反射机制允许在运行时动态获取类信息、创建对象及调用其方法。它基于`Class`类,让我们能访问类的属性、方法、构造器。例如,通过`Class.forName()`加载类,`Class.newInstance()`创建对象,`Method.invoke()`执行方法。反射广泛应用于动态代理、单元测试、序列化及框架中,提供灵活性但牺牲了性能,且可破坏封装性。IDE的代码补全也是反射的应用之一。在使用时需谨慎,避免对私有成员的不当访问。
23 1
|
1月前
|
安全 Java 开发者
Java并发编程:理解并发安全与性能优化
在当今软件开发中,Java作为一种广泛使用的编程语言,其并发编程能力显得尤为重要。本文深入探讨了Java中的并发编程,包括如何确保并发安全性以及优化并发程序的性能。通过分析常见的并发问题和解决方案,读者将能够更好地理解如何利用Java的并发工具包来构建可靠和高效的多线程应用程序。 【7月更文挑战第10天】
|
1月前
|
Java 程序员 测试技术
解析Java中的反射机制及其应用场景
解析Java中的反射机制及其应用场景
|
1月前
|
开发框架 Java Android开发
Java中的类反射与动态代理详解
Java中的类反射与动态代理详解
|
1月前
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
40 0
|
1月前
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
36 0
|
1月前
|
安全 Java 开发者
Java多线程:Java中如何创建线程安全的集合,编程中如何优化Java多线程集合
Java多线程:Java中如何创建线程安全的集合,编程中如何优化Java多线程集合
27 0
|
1月前
|
Java API
Java注解与反射机制
Java注解与反射概述: - 注解用于元数据,包括元注解`@Target`, `@Retention`, `@Documented`, `@Inherited`。 - 自定义注解用于自定义行为标记,参考[链接]例化后通过`getClass()`获取类信息。 - 主要API涉及类的多种获取方式,如`对象.getClass()`, `类名.class`, `Class.forName()`和内置类型`TYPE`。 - 应用场景包括动态创建对象,获取泛型和注解信息以及分析运行时结构。