freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

Java代码审计之反射第一篇
Artio 2022-04-28 10:02:18 132750
所属地 北京

Java反射

一、定义

Java反射机制是在程序运行状态下,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用这个对象的任意方法和属性;这样动态或者以及动态调用的功能就叫反射。

二、基本运用

  1. 获取类对象

    • forName()方法

      • 如果要使用Class类中的方法获取类对象,就需要使用forName方法,只需要类名称即可。

      • 这种方法并不陌生,在配置JDBC的时候,我们通常使用这种方法。

      public class forname {
      

    public static void main(String[] args) throws ClassNotFoundException{
    Class name = Class.forName("java.lang.Runtime");
    System.out.println(name);
    }
    }
    ```

    • 直接获取

      • 任何数据类型都具备静态的属性,因此可以使用.class 直接获取其对应的Class对象,但要明确用到类中的静态成员。

      public class direct {
      

    public static void main(String[] args) throws ClassNotFoundException{
    Class name = Runtime.class;
    System.out.println(name);
    }
    }
    ```

    • getClass()方法

      • 我们可以通过Object类中的getClass方法来获取字节码对象,不过这种方法较为繁琐,必须先要明确具体的类,然后创建对象a,然后a.getClass()获取。

      public class getClass {
      

    public static void main(String[] args) throws ClassNotFoundException{
    Runtime rt = Runtime.getRuntime();
    Class name = rt.getClass();
    System.out.println(name);
    }
    }
    ```

    • getSystemClassLoader().loadClass方法

      • 该方法与forName方法类似,只要有类名称即可,但是与forName方法有些区别:

      • forName的静态方法JVM会装载类,并且执行static()中的代码;

      • getSystemClassLoader().loadClass()不会执行static()中的代码;

      • 比如前边提到的JDBC就是利用forName方法,使JVM查找并加载制定的类到内存,此时将"com.mysql.jdbc.Driver"当作参数传入,就是告知JVM去"com.mysql.jdbc"路径下查找Driver类,并将其加载到内存中。

      public class getSystemClassLoader_loadClass {
      

    public static void main(String[] args) throws ClassNotFoundException{
    Class<?> name = ClassLoader.getSystemClassLoader().loadClass("java.lang.Runtime");
    System.out.println(name);
    }
    }
    ```

  2. 获取类方法

    • getDeclaredMethods方法

      • 该方法返回类或接口声明的所有方法,包括public、protected、private和默认方法,但不包括继承的方法。

      import java.lang.reflect.Method;
      
      

public class getDeclaredMethods {
public static void main(String[] args) throws ClassNotFoundException{
Class<?> name = Class.forName("java.lang.Runtime");
Method[] declaredMethods = name.getDeclaredMethods();
System.out.println("通过getDeclaredMethods方式获取方法:");
for (Method m:declaredMethods)
System.out.println(m);
}
}
```

* getMethods方法
    * 该方法返回某个类的所有public方法,包括其继承类的public方法。
    *
    ``` java
    import java.lang.reflect.Method;

public class getMethods {
public static void main(String[] args) throws ClassNotFoundException{
Runtime rt = Runtime.getRuntime();
Class<?> name = rt.getClass();
Method[] methods = name.getMethods();
System.out.println("通过getMethods方式获取的方法:");
for (Method m:methods)
System.out.println(m);
}
}
```

* getMethod方法
    * 该方法只能返回一个特定的方法,如Runtime类中的exec方法,该方法的第一个参数为方法名称,后边的参数为方法的参数对应Class的对象。
    *
    ``` java
    import java.lang.reflect.Method;

public class getMethod {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException{
Runtime rt = Runtime.getRuntime();
Class<?> name = rt.getClass();
Method method = name.getMethod("exec", String.class);
System.out.println("通过getMethod方式获取的方法:");
System.out.println(method);
}
}
```

* getDeclaredMethod方法
    * 该方法与getMethod方法类似,也只能返回一个特定的方法,该方法的第一个参数为方法名,第二个是方法参数。
    *
    ``` java
    import java.lang.reflect.Method;

public class getDeclaredMethod {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException{
Runtime rt = Runtime.getRuntime();
Class<?> name = rt.getClass();
Method method = name.getDeclaredMethod("exec", String.class);
System.out.println("通过getDeclaredMethod方式获取的方法:");
System.out.println(method);
}
}
```

  1. 获取类成员变量

    • getDeclaredFields方法

      • 该方法可以获得类的成员变量数组,包括public、private和proteced,但是不包括父类的申明字段。

      import java.lang.reflect.Field;
      
      

public class getDeclaredFields {
public static void main(String[] args) throws ClassNotFoundException{
Student student = new Student();
Class<?> name = student.getClass();
Field[] getDeclaredFields = name.getDeclaredFields();
System.out.println("通过getDeclaredFields方式获取的方法:");
for (Field f:getDeclaredFields)
System.out.println(f);
}
}
```

* getFields方法
    * 该方法能够获得某个类的所有public字段,包括父类中的字段。
    *
    ``` java
    import java.lang.reflect.Field;

public class getFields {
public static void main(String[] args) throws ClassNotFoundException{
Student student = new Student();
Class<?> name = student.getClass();
Field[] getFields = name.getFields();
System.out.println("通过getFields方式获取的字段:");
for (Field f:getFields)
System.out.println(f);
}
}
```

* getDeclaredField方法
    * 该方法与getDeclaredFields的区别是只能获取类的单个成员变量
    *
    ``` java
    import java.lang.reflect.Field;

public class getDeclaredField {
public static void main(String[] args) throws ClassNotFoundException,NoSuchFieldException{
Student student = new Student();
Class<?> name = student.getClass();
Field getDeclaredField = name.getDeclaredField("name");
System.out.println("通过getDeclaredField方式获取方法:");
System.out.println(getDeclaredField);
}
}
```

* getField方法
    * 与getFields方法类似,该方法能够获得某个类特定的public字段,包括父类中的字段
    *
    ``` java
    import java.lang.reflect.Field;

public class getField {
public static void main(String[] args) throws ClassNotFoundException,NoSuchFieldException{
Student student = new Student();
Class<?> name = student.getClass();
Field getField = name.getField("content");
System.out.println("通过getField方式获取方法:");
System.out.println(getField);
}
}
```

# web安全 # java # JAVA安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 Artio 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
Artio LV.4
这家伙太懒了,还未填写个人描述!
  • 14 文章数
  • 3 关注者
利用CDN进行攻击以及检测思路
2025-01-06
CSDN挂马事件及其检测思路
2025-01-02
浅谈DNS重绑定攻击
2023-05-19