有没有办法在内部类中使用反射或不使用反射来访问私有方法

0 java reflection inner-classes

我正在尝试举一个用户和银行程序的简单示例,在该示例中,您必须保证钱不能被可以添加,继承,实现当前现有类但不能编辑初始类的人所欺骗。因此,我问您是否可以在没有提供的转账功能的情况下设置某人的帐户余额。

我尝试使用反射,但是您必须具有公共构造函数才能创建一个对象,在该对象上调用私有方法,但是由于所有内容都是私有的,因此无法对其进行调用。

public class Bank {
    private static Bank ourInstance = new Bank();
    public static Bank getInstance() {
        return ourInstance;
    }

    private Bank() {}

    public boolean requestTransfer(User user1, User user2, double amount) {
        BankAccount ba1 = (BankAccount) user1.getBankAccount();
        BankAccount ba2 = (BankAccount) user2.getBankAccount();
        if (!(hasAccount(ba1) && hasAccount(ba2)))
            return false;

        if (ba1.getBalance() >= amount)
        {
            ba1.setBalance(ba1.getBalance() - amount);
            ba2.setBalance(ba2.getBalance() + amount);
            return true;
        }
        return false;
    }

    private class BankAccount implements BankAccountInterface {
        private double balance;
        private User user;

        private BankAccount(double balance) {
            this.balance = balance;
        }

        @Override
        public double getBalance() {
            return balance;
        }

        @Override
        public User getUser() {
            return user;
        }

        public void setUser(User user) {
            this.user = user;
        }

        private void setBalance(double balance) {
            this.balance = balance;
        }
    }
}

public interface BankAccountInterface {
    double getBalance();
    User getUser();
}

public class User {
    private String username;
    private String password;
    private Date created_at;
    private BankAccountInterface bankAccount;
    //constructor getters and setters etc..
}

Run Code Online (Sandbox Code Playgroud)

如果您可以添加自己的类继承当前的类,则可以使用反射或任何您可以随意非法使用的金钱。

gur*_*oso 6

这是一个安全问题。您可以使用安全管理器设置防反射,看到这个这个,由字节码操作界面的变化是问题出在类加载后,看到这个。但是,还有其他安全漏洞,这是 官方列表,臭名昭著的反序列化漏洞最初是有意设计的。这些都是已知问题,没有考虑零日漏洞利用。这是关于安全管理器的复杂性以及与此漏洞利用相关的某些API 的更详细的讨论