Java安全-01反射

admin 2022年2月18日13:19:52评论44 views字数 4484阅读14分56秒阅读模式

Java安全-01反射


知识基础

  • 对象

  • 构造方法

  • 重载

  • 单例模式

动态加载

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);}

Java安全-01反射


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

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

Java安全-01反射


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) {
} }}

Java安全-01反射


Java安全-01反射

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");
}}

Java安全-01反射


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); }}

Java安全-01反射

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); }}

Java安全-01反射


获取成员方法

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");
}}

Java安全-01反射


Java安全-01反射


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 对 象。

Java安全-01反射




往期回顾

01

使用goby检测log4j漏

02

小程序测试流

03

ModSecurity 搭建web安全防火墙和流量检测



原文始发于微信公众号(雷石安全实验室):Java安全-01反射

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月18日13:19:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java安全-01反射http://cn-sec.com/archives/792004.html

发表评论

匿名网友 填写信息