反编译

本文详细介绍了如何使用Java的反射机制进行反编译,包括访问和操作类的属性、方法、构造器,以及如何通过反射调用方法和构造器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、利用反射机制进行反编译

1.1 属性

package com.company.reflect;

import org.junit.Test;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class ReflectTest05 {
    @Test
    public void test01() {
        try {
            Class c = Class.forName("com.company.reflect.Student");

            String className = c.getName();
            System.out.println("完整类名:" + className);

            String simpleName = c.getSimpleName();
            System.out.println("简类名:" + simpleName);

            System.out.println("=================================================");

            // 获取类中所有的public修饰的Field
            Field[] fields = c.getFields();

            for (Field f : fields) {
                System.out.println("属性名:"+f.getName()+"的类型是==》"+f.getType());
            }

            System.out.println("=================================================");

            // 获取所有的Field
            Field[] fields1 = c.getDeclaredFields();
            for (Field f : fields1) {
                System.out.println("属性名:"+f.getName()+" 的类型是 ==》 "+f.getType().getSimpleName()+" 修饰符是 ==》 "+ Modifier.toString(f.getModifiers()));
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test02() throws ClassNotFoundException {
        // 拼接字符串
        StringBuffer s = new StringBuffer();

        // Class c = Class.forName("com.company.reflect.Student");
        Class c = Class.forName("java.lang.String");

        s.append(Modifier.toString(c.getModifiers()) + " class "+ c.getSimpleName() +" {");

        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            s.append("\n");
            s.append("\t");
            s.append(Modifier.toString(field.getModifiers()));
            s.append(" ");
            s.append(field.getType().getSimpleName());
            s.append(" ");
            s.append(field.getName());
            s.append(";");
        }

        s.append("\n");
        s.append("}");

        System.out.println(s);
    }
}

运行Test01:
在这里插入图片描述

1.2 方法

运行Test02:
在这里插入图片描述


package com.company.reflect;

/**
 * 用户业务类
 */
public class UserService {

    /**
     * 登录方法
     * @param name 用户名
     * @param password 密码
     * @return true表示登录成功,false表示登录失败!
     */
    public boolean login(String name,String password){
        if("admin".equals(name) && "123456".equals(password)){
            return true;
        }
        return false;
    }

    // 可能还有一个同名login方法
    // java中怎么区分一个方法,依靠方法名和参数列表。
    public void login(int i){

    }

    /**
     * 退出系统的方法
     */
    public void logout(){
        System.out.println("系统已经安全退出!");
    }
}


 @Test
    public void test01() throws Exception {
        // 拼接字符串
        StringBuffer s = new StringBuffer();

        // Class c = Class.forName("com.company.reflect.Student");
        Class c = Class.forName("com.company.reflect.UserService");

        s.append(Modifier.toString(c.getModifiers()) + " class "+ c.getSimpleName() +" {");

        Method[] methods = c.getDeclaredMethods();
        for(Method method : methods){
            //public boolean login(String name,String password){}
            s.append("\n");
            s.append("\t");
            s.append(Modifier.toString(method.getModifiers()));
            s.append(" ");
            s.append(method.getReturnType().getSimpleName());
            s.append(" ");
            s.append(method.getName());
            s.append("(");
            // 参数列表
            Class[] parameterTypes = method.getParameterTypes();
            for(Class parameterType : parameterTypes){
                s.append(parameterType.getSimpleName());
                s.append(",");
            }
            // 删除指定下标位置上的字符
            s.deleteCharAt(s.length() - 1);
            s.append("){}\n");
        }

        s.append("}");
        System.out.println(s);


    }

在这里插入图片描述

1.3 构造方法

@Test
    public void test03() throws ClassNotFoundException {
        StringBuilder s = new StringBuilder();
        Class vipClass = Class.forName("java.lang.String");
        s.append(Modifier.toString(vipClass.getModifiers()));
        s.append(" class ");
        s.append(vipClass.getSimpleName());
        s.append("{\n");

        // 拼接构造方法
        Constructor[] constructors = vipClass.getDeclaredConstructors();
        for(Constructor constructor : constructors){
            //public Vip(int no, String name, String birth, boolean sex) {
            s.append("\t");
            s.append(Modifier.toString(constructor.getModifiers()));
            s.append(" ");
            s.append(vipClass.getSimpleName());
            s.append("(");
            // 拼接参数
            Class[] parameterTypes = constructor.getParameterTypes();
            for(Class parameterType : parameterTypes){
                s.append(parameterType.getSimpleName());
                s.append(",");
            }
            // 删除最后下标位置上的字符
            if(parameterTypes.length > 0){
                s.deleteCharAt(s.length() - 1);
            }
            s.append("){}\n");
        }

        s.append("}");
        System.out.println(s);

    }

在这里插入图片描述

1.4 反射调用方法

 @Test
    public void test02 () throws Exception {

        // 不使用反射机制,怎么调用方法
        UserService userService = new UserService();
        boolean loginSuccess = userService.login("admin","123456");
        System.out.println(loginSuccess ? "登录成功":"登录失败"); // true

        Class c = Class.forName("com.company.reflect.UserService");
        Object obj = c.newInstance();

        // Method[] methods = c.getDeclaredMethods(); // 所有的方法
        Method m = c.getDeclaredMethod("login", String.class, String.class);

        Object retValue = m.invoke(obj,"admin","123456");

        System.out.println(retValue);

    }

1.5 反射调用构造器

package com.company.reflect;

public class Vip {
    int no;
    String name;
    String birth;
    boolean sex;

    public Vip() {
    }

    public Vip(int no) {
        this.no = no;
    }

    public Vip(int no, String name) {
        this.no = no;
        this.name = name;
    }

    public Vip(int no, String name, String birth) {
        this.no = no;
        this.name = name;
        this.birth = birth;
    }

    public Vip(int no, String name, String birth, boolean sex) {
        this.no = no;
        this.name = name;
        this.birth = birth;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Vip{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", birth='" + birth + '\'' +
                ", sex=" + sex +
                '}';
    }

}

@Test
    public void test04() throws Exception {
        // 不使用反射机制怎么创建对象
        Vip v1 = new Vip();
        Vip v2 = new Vip(110, "zhangsan", "2001-10-11", true);

        // 使用反射机制怎么创建对象呢?
        Class c = Class.forName("com.company.reflect.Vip");
        // 调用无参数构造方法
        Object obj = c.newInstance();
        System.out.println(obj);

        // 调用有参数的构造方法怎么办?
        // 第一步:先获取到这个有参数的构造方法
        Constructor con = c.getDeclaredConstructor(int.class, String.class, String.class,boolean.class);
        // 第二步:调用构造方法new对象
        Object newObj = con.newInstance(110, "jackson", "1990-10-11", true);
        System.out.println(newObj);

        // 获取无参数构造方法
        Constructor con2 = c.getDeclaredConstructor();
        Object newObj2 = con2.newInstance();
        System.out.println(newObj2);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值