标签: anonymous-class

是否可以在使用反射时创建匿名类?

我希望能够在对象运行初始化程序之前在运行时实现一个方法.这将允许我设置初始化期间使用的字段.

这是一个例子:

class A {
  public A() {
    initialize();
  }
  public void initialize() { }
}

class B extends A {
  public String message;
  {
    System.out.println(message);
  }
}

public class MainClass {
  public static void main(final String[] args) throws Exception {

    Class<A> aClass = (Class<A>)Class.forName(args[0]);
    // what's next in order to something like this even though
    // I don't know what subclass of A was passed in as an
    // argument above 
    A a = aClass.newInstance()
    {
      public void initialize() …
Run Code Online (Sandbox Code Playgroud)

java reflection anonymous-class

7
推荐指数
1
解决办法
4473
查看次数

在匿名类中测试方法时,如何使用Powermockito来模拟新对象的构造?

我想写一个JUnit测试来验证下面的代码使用BufferedInputStream:

public static final FilterFactory BZIP2_FACTORY = new FilterFactory() {
    public InputStream makeFilter(InputStream in) {        
        // a lot of other code removed for clarity 
        BufferedInputStream buffer = new BufferedInputStream(in);
        return new CBZip2InputStream(buffer);
    }
};
Run Code Online (Sandbox Code Playgroud)

(FilterFactory是一个接口.)

到目前为止我的测试看起来像这样:

@Test
public void testBZIP2_FactoryUsesBufferedInputStream() throws Throwable {
    InputStream in = mock(InputStream.class);
    BufferedInputStream buffer = mock(BufferedInputStream.class);
    CBZip2InputStream expected = mock(CBZip2InputStream.class);

    PowerMockito.spy(InputHelper.BZIP2_FACTORY);  // This line fails
    whenNew(BufferedInputStream.class).withArguments(in).thenReturn(buffer);
    whenNew(CBZip2InputStream.class).withArguments(buffer).thenReturn(expected);
    InputStream observed = InputHelper.BZIP2_FACTORY.makeFilter(in);

    assertEquals(expected, observed);
}
Run Code Online (Sandbox Code Playgroud)

对PowerMockito.spy的调用会引发此消息的异常:

org.mockito.exceptions.base.MockitoException: 
Mockito cannot mock this class: class edu.gvsu.cis.kurmasz.io.InputHelper$1
Mockito can …
Run Code Online (Sandbox Code Playgroud)

java anonymous-class mockito powermock object-construction

7
推荐指数
2
解决办法
4万
查看次数

匿名扩展类并同时实现接口?

假设我有一个名为Interface的接口,以及一个名为Base的具体类,为了使事情变得更复杂,有一个需要一些参数的ctor.

我想创建一个扩展Base并实现Interface的匿名类.

就像是

 Interface get()
 {
     return new Base (1, "one") implements Interace() {};
 }
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来很合理,但它不起作用!

(PS:实际上,接口和基础也是通用类:D.但我现在会忽略它)

java anonymous-class

7
推荐指数
2
解决办法
7389
查看次数

如何在TypeScript中使用匿名类

我正在尝试创建一个辅助函数,添加currying,以生成类的常见设置.例如:

class Person {
    private name: string;
    private sex: string;

    constructor (name: string, sex: string) {
        this.name = name;
        this.sex = sex;
    }
}

var newPersonSex = function (sex: string) {
    return function (name: string) {
        return new Person(name, sex);
    }
}

var MalePerson = newPersonSex('male'); 
var FemalePerson = newPersonSex('female'); 
Run Code Online (Sandbox Code Playgroud)

因此,现在当创建MalePerson和FemalePerson对象时,它实际上只返回Person的新实例.

var m = new MalePerson( 'john' );
Run Code Online (Sandbox Code Playgroud)

为了让类型系统允许我仍然使用'new',MalePerson需要是一个构造函数类型.例如:'new(name:string)=> Person'.这也需要是函数的返回类型.

但是添加了这些声明后,我无法从'newPersonSex'中返回一个函数.例如,这是无效的:

var newPersonSex = function (sex: string) : new(name:string) => Person {
    return function (name: string) {
        return new Person(name, …
Run Code Online (Sandbox Code Playgroud)

constructor anonymous-class typescript

7
推荐指数
1
解决办法
2426
查看次数

匿名类声明中的语句

我正在浏览oracle文档中的匿名类教程(https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)

我已经复制了本教程中使用的代码.(注释Statement1和Statement2由我添加):

public class HelloWorldAnonymousClasses {

    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }

    public void sayHello() {

        class EnglishGreeting implements HelloWorld {
            String name = "world";
            public void greet() {
                greetSomeone("world");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }

        HelloWorld englishGreeting = new EnglishGreeting();

        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde"; //Statement1
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void …
Run Code Online (Sandbox Code Playgroud)

java anonymous-class

7
推荐指数
1
解决办法
887
查看次数

从Eclipse中的asyncExec中获取返回值的最佳方法是什么?

我正在编写Eclipse插件,并且经常出现这样的情况,即正在运行的Job需要暂停一段时间,在UI线程上异步运行并恢复.

所以我的代码通常看起来像:

Display display = Display.getDefault();
display.syncExec(new Runnable() {
    public void run() {
                // Do some calculation
                // How do I return a value from here?
    }
});
// I want to be able to use the calculation result here!
Run Code Online (Sandbox Code Playgroud)

一种方法是让整个Job类都有一些字段.另一种方法是使用自定义类(而不是匿名类,并使用其生成的数据字段等.什么是最好和最优雅的方法?

eclipse eclipse-plugin anonymous-class

6
推荐指数
2
解决办法
2811
查看次数

私有内部类合成意外的匿名类

当您使用私有内部类编译Java类时,似乎匿名类由于某种原因自动合成.这个类足以重现它:

public class SynthesizeAnonymous {
    public static void method() {
        new InnerClass();
    }

    private static class InnerClass {}
}
Run Code Online (Sandbox Code Playgroud)

编译时,这会生成预期的SynthesizeAnonymous.classSynthesizeAnonymous$InnerClass.class文件,但它也会生成一个奇怪的SynthesizeAnonymous$1.class文件,该文件对应java.lang.Object于合成的匿名子类.如果你看一下反汇编javap,看来默认的构造函数InnerClass获得了这个匿名类型的隐藏参数,并nullnew InnerClass()调用时传递给它.

为什么要创建这个类?即使InnerClass它不是静态的,也会创建它,但如果InnerClass不是私有的,或者没有InnerClass创建任何实例,则不会创建它.它是某种形式的访问控制?这是如何运作的?

java private language-implementation anonymous-class

6
推荐指数
1
解决办法
357
查看次数

Android Studio / IntelliJ 匿名类格式

我想知道是否可以更改 Android Studio 中的自动格式,将匿名类的大括号放置在同一行,同时仍将常规类、方法和块的大括号放置在新行上。

目前,IntelliJ 给了我这个结果:

class TestClass
{
    public void test()
    {
        FooBar foo = new FooBar(new Runnable() // I want the brace here...
        { // ...not here.
            @Override
            public void run()
            {
                //
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望代码的格式如下:

class TestClass
{
    public void test()
    {
        FooBar foo = new FooBar(new Runnable() { // <- Same Line
            @Override
            public void run()
            {
                //
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,除了一个细节,即我无法像第二个示例中那样格式化大括号。这是不可能的还是我只是忽略了设置?

code-formatting intellij-idea anonymous-class android-studio

6
推荐指数
1
解决办法
1519
查看次数

匿名类作为泛型参数


我想创建一个类,从匿名类定义中获取一个对象来存储.我使用泛型类来实现它.然后我想使用功能接口定义一些操作,这些接口将此对象作为要使用的参数.
代码说的不仅仅是文字.所以看看这个:

public class Test<T> {
    @FunctionalInterface
    public interface operation<T> {
        void execute(T object);
    }
    private T obj;
    public Test(T _obj){
        obj = _obj;
    }
    public void runOperation(operation<T> op){
        op.execute(obj);
    }

    public static void main(String[] args){
        Test<?> t = new Test<>(new Object(){
            public String text = "Something";
        });
        t.runOperation((o) -> {
            System.out.println(o.text);  // text cannot be resolved
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是o.text在功能接口的实现中无法解决.这是某种类型的擦除后果吗?
有趣的是,当我在构造函数中实现功能接口时,我可以使用此代码.
看看这段代码:

public class Test<T> {
    @FunctionalInterface
    public interface operation<T> {
        void execute(T object);
    }
    private T obj;
    private …
Run Code Online (Sandbox Code Playgroud)

java generics lambda anonymous-class

6
推荐指数
1
解决办法
885
查看次数

lambda vs匿名类

我有以下代码:

eventBus.subscribe(new EventBusListener<NavigationEvent>() {
    @Override
    public void onEvent(Event<NavigationEvent> event) {
        event.getPayload();
    }
});

eventBus.subscribe(new EventBusListener<NotificationEvent>() {
    @Override
    public void onEvent(Event<NotificationEvent> event) {
        event.getPayload();
    }
});
Run Code Online (Sandbox Code Playgroud)

IntelliJ告诉我,我可以用lambda表达式替换这两个匿名类,如:

eventBus.subscribe((EventBusListener<NavigationEvent>) Event::getPayload);
eventBus.subscribe((EventBusListener<NotificationEvent>) Event::getPayload);
Run Code Online (Sandbox Code Playgroud)

编译效果很好,但在运行时,出现以下错误的应用程序崩溃:java.lang.IllegalArgumentException: Could not resolve payload type引起getPayload()Event<T>类.

我是缺少什么lamdbasgenerics

generics lambda anonymous-class java-8

6
推荐指数
1
解决办法
615
查看次数