可以在构造函数中对Java对象进行子类化吗?
可以在构造函数中对Java对象进行子类化吗 我是一名Java新手,正在尝试使用Selenium。在这里的一篇文章中,有一条关于如何修改HtmlUnitDriver驱动程序对象以支持身份验证的说明,我在这里重复了一些演示代码可以在构造函数中对Java对象进行子类化吗?,java,constructor,selenium-webdriver,subclassing,Java,Constructor,Selenium Webdriver,Subclassing,可以在构造函数中对Java对象进行子类化吗 我是一名Java新手,正在尝试使用Selenium。在这里的一篇文章中,有一条关于如何修改HtmlUnitDriver驱动程序对象以支持身份验证的说明,我在这里重复了一些演示代码 WebDriver driver = new HtmlUnitDriver() { protected WebClient modifyWebClient(WebClient client) { // This class ships with HtmlUnit
WebDriver driver = new HtmlUnitDriver() {
protected WebClient modifyWebClient(WebClient client) {
// This class ships with HtmlUnit itself
DefaultCredentialsProvider creds = DefaultCredentialsProvider();
// Set some example credentials
creds.addCredentials("username", "password");
// And now add the provider to the webClient instance
client.setCredentialsProvider(creds);
return client;
}
};
代码是进入子类定义的示例还是“内联”修改?我假设这是可能的,但是当我将它复制到IDE中时,我得到了语法错误,显示一些属性没有定义
在进一步了解Java、匿名类和重写之后,这是我当前的代码。
但是我在Netbeans中的DefaultCredentialsProvider上遇到了一个语法错误,我不确定这是由于缺少必需的类,还是需要进行更多的更改
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package seleniumtest01;
/**
*
* @author richard
*/
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
import com.gargoylesoftware.htmlunit.WebClient;
//import org.openqa.selenium.htmlunit.ChromeDriver;
public class Main {
public static void main(String[] args) {
// Create a new instance of the Firefox driver
// Notice that the remainder of the code relies on the interface,
// not the implementation.
testBasicAuth();
System.exit(0);
}
public static void testBasicAuth() {
// Create a new instance of the Firefox driver
// Notice that the remainder of the code relies on the interface,
// not the implementation.
//WebDriver driver = new FirefoxDriver();
WebDriver driver = new HtmlUnitDriver() {
@Override
protected WebClient modifyWebClient(WebClient client) {
// This class ships with HtmlUnit itself
DefaultCredentialsProvider creds = DefaultCredentialsProvider();
// Set some example credentials
creds.addCredentials("username", "password");
// And now add the provider to the webClient instance
client.setCredentialsProvider(creds);
return client;
}
};
driver.get("http://user:selenium@192.168.1.2/");
new WebDriverWait(driver, 10);
WebElement element = driver.findElement(By.xpath("//a[text()='Connection']"));
element.click();
//element = driver.findElement(By.xpath("//a[text()='Admin Login']"));
element = driver.findElement(By.xpath("//a[contains(@href, 'admin/connection')]"));//[contains(@href,'#id1')]
element.click();
element = driver.findElement(By.xpath("//a[text()='Connection 1']"));
element.click();
element = driver.findElement(By.name("field_one"));
element.clear();
element.sendKeys("sample text");
//driver.findElement(By. id("submit")).click();
element.submit();
new WebDriverWait(driver, 10);
driver.quit();
}
}
您展示的代码不是在修改原始类,而是在创建
HtmlUnitDriver
的匿名子类
例如:
class A {
void sayHello() { System.out.println("Hello!"); }
}
class Main {
public static void main(String[] args) {
A a = new A() {
@Override void sayHello() { System.out.println("Good bye"); }
}
a.sayHello();
}
}
这将打印
再见
。局部变量a
持有的实例类型是一个匿名类,由编译器自动生成。类的名称类似于Main$0
如果没有类HtmlUnitDriver
的Javadoc,很难给出这个问题的明确答案。如果HtmlUnitDriver
是一个抽象类或接口,那么问题中的示例代码称为匿名类。否则,代码只是覆盖类的方法。在sqa.stackexchange.com上发布问题后,我得到了WebDriver的构造函数应该是:
WebDriver driver = new HtmlUnitDriver() {
@Override
protected WebClient modifyWebClient(WebClient client) {
// This class ships with HtmlUnit itself
DefaultCredentialsProvider creds = new DefaultCredentialsProvider();
// Set some example credentials
creds.addCredentials("user", "selenium");
// And now add the provider to the webClient instance
client.setCredentialsProvider(creds);
return client;
}
};
添加覆盖后,我丢失了creds初始化的new
,这是一个Java新手错误。
感谢您的帮助如果您将某些内容声明为受保护,您可能会忘记@Override?我是Java新手,正在学习关于子类、匿名类等的Java视图,@Override已经出现在Netbeans中,因此我现在正在查找它。