![](/img/trans.png)
[英]How to define a new method inside an existing class and add a call to it in an existing method inside the same class using bytebuddy?
[英]Add new method to existing class
我知道匿名類,我們可以用它來覆蓋類方法,這是一個例子:
public class User {
private final String name;
public User(final String name){
this.name=name;
}
public void sayHello(){
System.out.println("Hello : "+name);
}
public static void main(String[] args) {
User s = new User("CHORT"){
@Override
public void sayHello(){
System.out.println("HELLO FROM ANONYMOUS CLASS");
}
};
}
}
但我注意到以下構造也是正確的(我的IDEA未突出顯示)
public class User {
private final String name;
public User(final String name){
this.name=name;
}
public void sayHello(){
System.out.println("Hello : "+name);
}
public static void main(String[] args) {
User s = new User("CHORT"){
public void sayHello2(){
System.out.println("HELLO FROM ANONYMOUS CLASS");
}
};
}
}
但是當我想調用方法sayHello2時,IDEA告訴我它不存在。此構造的目的是什么?
首先,問題的標題是錯誤的。 您沒有“向現有類添加新方法”。 您將方法添加到擴展現有類的匿名類中。
匿名類可以包含常規類所做的任何方法。 它們不必只包含它們擴展的類的方法或它們實現的接口。
因此,在匿名類中定義sayHello2
是完全有效的,但是非常無用,因為您不能從匿名類主體外部調用該方法。
另一方面,如果您確實從匿名類主體中調用它(並且可以將其設為private
,因為無論如何都不能從外部調用它),則可能會很有用:
User s = new User("CHORT") {
@Override
public void sayHello() {
sayHello2();
}
private void sayHello2() {
System.out.println("HELLO FROM ANONYMOUS CLASS");
}
};
編輯:我想過的另一件事-您可能可以使用反射從外部調用您的sayHello2
,盡管我不確定您為什么要這么做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.