`
OliveExcel
  • 浏览: 71632 次
文章分类
社区版块
存档分类
最新评论

Java通过代理创建Interface的匿名实现类

阅读更多

昨天帮同事看问题的时候碰到的, 简要描述一下实现.

 

需求:

Java下反射获取Interface, 实例化它并同时实现其中的方法.

 

实现: 

反射一个类好说, 从类名拿到Class再newInstance一把就有, 方法什么的, 也是Method.invoke一下就行.

但是反射一个Interface, 以前没碰到过, 同事听别人说要用代理实现, 于是百度后试了一把, 果然可以.

 

反射这个Interface:

package com.test.util;
public interface TestInterface {
    public int getInt();
}

 

 

1. 先要拿到ClassLoader和Interface(以com.test.util.TestInterface为例), 后者不需要实例化, 当然也不能够实例化:

ClassLoader loader = InterfaceProxy.class.getClassLoader();
Class interfazz = loader.loadClass("com.test.util.TestInterface");

 2. 然后就是通过Proxy拿到Interface实例, 同时实现其中的方法:

Object clazzInstance = Proxy.newProxyInstance(loader, new Class[] { interfazz }, new InvocationHandler() {

    @Override
    public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("getInt")) {
            return 1234;
        } else {
            return method.invoke(obj, args);
        }
    }
});

 3. 拿到了实例, 就能调用了, 调用的时候当然是通过反射:

Method method = clazzInstance.getClass().getMethod("getInt", new Class[] {});
System.out.println("getInt = " + (int) method.invoke(clazzInstance, new Class[] {}));

 4. 可以看到输出的log是:

getInt = 1234

 

需求的逻辑就这样通了~~~~~

 

======================== 纯纯的分隔线 ========================

 

这部分还能扩展一下, 注意Proxy.newProxyInstance方法的第二个参数. 该参数是一个Class数组, 即具备"实例化一个实现了多个Interface的匿名类"的能力. 在实现多个Interface后, 可以在invoke方法下根据方法名 & 参数来实现指定的方法.

另外, 这里面还有一个值得注意的地方, 就是实现这些Interface时, 不需要实现所有方法, 因此在实现类下未实现的方法被调用时, 会crash.

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java 匿名内部类

    Java匿名内部类可以用来直接实现一个接口,无需为这个接口创建单独的实现类。这在处理事件监听时特别常见,比如在Swing或Android开发中,我们可以直接在需要的地方创建一个匿名内部类来实现事件处理器接口。 2. **...

    Java中的interface接口

    同时,接口还可以包含静态方法,它们不属于接口的任何实现类,而是通过接口名直接调用。 6. **接口的常量**: 接口中定义的成员变量默认为public static final,即常量。它们在所有实现接口的类中都可直接访问。 ...

    Java特别篇-匿名对象与匿名内部类

    在这个示例中,我们创建了一个继承自`Person`类的匿名内部类,并通过`Person`类型的变量`p`引用它。接着调用了`sayHello`方法。 ### 总结 通过以上内容,我们可以看到Java中的匿名对象和匿名内部类都是十分实用的...

    基于Java的匿名内部类分析与应用.pdf

    "基于Java的匿名内部类分析与应用" ...匿名内部类是Java语言中的一大特色,它提供了一种灵活的方式来创建对象和实现接口。通过对匿名内部类的分析和应用,可以更好地理解和应用Java语言的匿名内部类机制。

    实现接口的匿名类

    在main方法中,我们创建了B类的一个实例b,并调用了它的fun方法,但是这里我们并没有创建一个明确的A接口实现类,而是使用了一个匿名类来实现A接口: ```java public class TestInterface { public static void ...

    匿名内部类实现接口回调

    这个"匿名内部类实现接口回调"的示例旨在演示如何通过匿名内部类来简化回调函数的实现。下面我们将详细探讨接口回调的概念、匿名内部类的使用以及它们在实际编程中的应用。 首先,让我们理解什么是接口回调。接口回...

    JAVA_匿名内部类

    Java匿名内部类是Java语言中一个独特且强大的特性,它允许我们在不定义完整类的情况下创建对象。这种类没有名字,通常用作一次性实现某个接口或继承某个类的情况,尤其是在需要简洁代码的地方。以下是对Java匿名内部...

    Android开发匿名内部类

    在Java编程语言中,匿名内部类是一种特殊的类,它没有名字,通常用于简化代码和实现特定功能,如事件处理或接口快速实现。在Android开发中,匿名内部类的应用尤其广泛,因为Android框架中的许多组件(如按钮、文本...

    匿名内部类核心重点知识讲解和经典例子讲解

    它可以通过继承一个类或实现一个接口来创建。 - **语法**:`new 类名/接口名() { // 实现部分 }` - **实例化**:匿名内部类创建的对象通常通过`new`关键字立即实例化。 2. **匿名内部类的分类** - **成员内部类*...

    java使用匿名类直接new接口.docx

    在Java编程语言中,接口的实现方式有很多种,其中一种较为特殊的实现方法是通过匿名内部类直接创建接口的实例。这种方式不仅简洁而且高效,在某些特定场景下尤其有用。本文将深入探讨这种实现方式,并通过具体的示例...

    Java通过接口实现匿名类的实例代码

    在Java编程语言中,匿名类是一种特殊的类,它没有名称,通常用于一次性、临时性的对象创建,尤其是在需要实现一个接口或继承一个类时,而无需为这个实现单独定义一个新的类。在给定的实例代码中,我们将看到如何通过...

    java 内部类 局部内部类 匿名类 实例代码

    本篇文章将深入探讨Java中的四种内部类:实例内部类、局部内部类、匿名类和静态内部类,并通过实例代码进行详细解析。 1. **实例内部类**:这是最常见的内部类形式,它在外部类的实例方法或成员位置定义。实例内部...

    匿名内部类代码

    匿名内部类是Java编程语言中一个独特且强大的特性,它允许我们在需要的地方直接定义一个类的实例,而无需声明一个独立的类。这种类没有名字,通常用于实现接口或者继承抽象类,尤其在事件处理、回调函数以及创建一次...

    Java通过匿名类来实现回调函数实例总结

    总的来说,Java通过接口和匿名类实现回调函数,虽然与C++中的函数指针或C++11后的lambda表达式有所不同,但同样提供了灵活的功能,使得代码能够更好地解耦和复用。通过理解这一机制,开发者可以在处理异步操作、事件...

    Java中interface接口与abstractclas

    在Java编程语言中,`interface`接口和`abstract class`抽象类是两种重要的面向对象设计概念,它们都用于实现多态性,但有着显著的区别。理解这些差异对于编写可扩展和可维护的代码至关重要。 首先,接口是完全抽象...

    Java 动态代理Proxy应用和底层源码分析.pdf

    Java动态代理是一种在运行时动态生成代理类的技术,通过该技术可以为一个或多个接口生成一个实现类,该实现类可以拦截接口方法的调用,并进行额外的操作。Java动态代理主要由`java.lang.reflect.Proxy`类和`java....

    java中匿名内部类详解

    总的来说,Java中的匿名内部类是一个强大的工具,它允许开发者在不需要为单次使用而创建完整类的情况下,方便地实现特定的功能或满足特定的需求。通过理解其工作原理和应用场景,开发者可以更有效地编写简洁、高效的...

    java内部类详解

    匿名内部类可以直接实例化,如 `new Interface() { ... };` 或 `new BaseClass() { ... };`,并在大括号中提供类的实现。这种方式常用于事件处理和回调机制。 内部类的主要优点包括: - 提供了一种封装的手段,可以...

    java中的匿名内部类详细总结

    就像 `interface Person` 定义的 `eat()` 方法,我们可以直接在 `main` 方法中创建一个匿名内部类并实现 `eat()`,简化代码。 3. **多线程中的应用**: 在Java多线程编程中,匿名内部类被广泛使用。你可以通过继承...

    非常精简的匿名内部类详解.docx

    在Java编程语言中,匿名内部类是一种特殊的类,它没有名称,通常用于简洁地实现某个接口或继承某个类,尤其在只需要单个实例且无需多次复用的情况下。这种设计模式可以大大简化代码,提高可读性。下面我们将深入探讨...

Global site tag (gtag.js) - Google Analytics