有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

电子邮件无法访问Java中父对象的受保护方法

我有个问题:

包含内部类的java类。内部类(Authenticator)扩展了javax.mail.Authenticator(请注意,类和子类的名称相同)

问题是我不能访问受保护的方法getPasswordAuthentication,除非内部类与扩展类同名(我的意思是Authenticator extends javax.mail.Authenticator)。 如果我写private class SMTPAuthenticator extends javax.mail.Authenticator,那么我就不能再访问受保护的getPasswordAuthentication。 见下面的代码:

import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;

public class MailWithPasswordAuthentication {
    public static void main(String[] args) throws MessagingException {
        new MailWithPasswordAuthentication().run();
    }

    private void run() throws MessagingException {
        Message message = new MimeMessage(getSession());

        message.addRecipient(RecipientType.TO, new InternetAddress("to@example.com"));
        message.addFrom(new InternetAddress[] { new InternetAddress("from@example.com") });

        message.setSubject("the subject");
        message.setContent("the body", "text/plain");

        Transport.send(message);
    }

    private Session getSession() {
        Authenticator authenticator = new Authenticator();

        Properties properties = new Properties();
        properties.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
        properties.setProperty("mail.smtp.auth", "true");

        properties.setProperty("mail.smtp.host", "mail.example.com");
        properties.setProperty("mail.smtp.port", "25");

        return Session.getInstance(properties, authenticator);
    }

    private class Authenticator extends javax.mail.Authenticator {
        private PasswordAuthentication authentication;

        public Authenticator() {
            String username = "auth-user";
            String password = "auth-password";
            authentication = new PasswordAuthentication(username, password);
        }

        protected PasswordAuthentication getPasswordAuthentication() {
            return authentication;
        }
    }
}

谢谢, A


共 (2) 个答案

  1. # 1 楼答案

    如果将验证器类重命名为SMTPAuthenticator,还应更改以下行:

    Authenticator authenticator = new Authenticator();
    

    SMTPAuthenticator authenticator = new SMTPAuthenticator();
    

    出现错误的原因是只有SMTPAuthenticator类包含getPasswordAuthentication()方法,而不是基类Authenticator

  2. # 2 楼答案

    如果您可以访问Authenticator extends javax.mail.Authenticatore,那么您应该能够访问class SMTPAuthenticator extends javax.mail.Authenticator。如果不是,那么你的观察是错误的