Java 动态生成类和实例, 并注入方法操作示例

 更新时间:2020年02月27日 12:26:50   作者:David_Ding  
这篇文章主要介绍了Java 动态生成类和实例, 并注入方法操作,结合实例形式分析了Java 动态生成类和实例以及动态注入相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java 动态生成类和实例, 并注入方法。分享给大家供大家参考,具体如下:

Java官方支持的, 必须要有接口才行

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
/**
 * @author David Ding
 *
 */
interface IJavaGen {
    int getRandomInt();
    void printClassInfo();
}
abstract class JavaGen implements IJavaGen {
    protected List<String> calledMethods = new LinkedList<>(); // property
    public int getRandomInt() { // Get a random integer
        return new Random().nextInt(10000);
    }
    public abstract void printClassInfo();
}
class JavaGenHandler implements InvocationHandler {
    private JavaGen mTarget;
    public JavaGenHandler(JavaGen javaGen) {
        mTarget = javaGen;
    }
    // 动态注入
    @Override
    public Object invoke(Object obj, Method method, Object[] params) throws Throwable {
        Object ret = null;
        String name = method.getName();
        if (name.equals("getRandomInt")) { // intercept the getRandomInt
            ret = method.invoke(mTarget, params); // call the base method
            System.out.println("Print random int: " + ret);
        } else if (name.equals("printClassInfo")) { // print class info
            System.out.println("Class: " + obj.getClass());
            method.invoke(mTarget, params);
        }
        mTarget.calledMethods.add(name); // change the property
        return ret;
    }
}
public class JavaCodeGen {
    public static void main(String[] args) {
        try {
            Class<?> genClass = Proxy.getProxyClass(IJavaGen.class.getClassLoader(), IJavaGen.class);
            Constructor<?> cons = genClass.getConstructor(InvocationHandler.class);
            JavaGen target = new JavaGen() {
                @Override
                public void printClassInfo() {
                    System.out.println("I have to implement this method!!");
                }
            };
            IJavaGen javaGen = (IJavaGen) cons.newInstance(new JavaGenHandler(target));
            javaGen.getRandomInt();
            javaGen.printClassInfo();
            System.out.println(target.calledMethods);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

Print random int: 8143
Class: class demo.$Proxy0
I have to implement this method!!
[getRandomInt, printClassInfo]

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • java的Guava工具包介绍

    java的Guava工具包介绍

    Java开发的同学应该都使用或者听说过Google提供的Guava工具包。日常使用最多的肯定是集合相关的工具类,还有Guava cache,除了这些之外Guava还提供了很多有用的功能,鉴于日常想用的时候找不到,这里就梳理一下Guava中那些好用的工具类,想优化代码的时候不妨过来看看
    2021-04-04
  • springboot搭建访客管理系统的实现示例

    springboot搭建访客管理系统的实现示例

    这篇文章主要介绍了springboot搭建访客管理系统的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • PowerJob的TransportServiceAware工作流程源码解读

    PowerJob的TransportServiceAware工作流程源码解读

    这篇文章主要介绍了PowerJob的TransportServiceAware工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • @NonNull导致无法序列化的问题及解决

    @NonNull导致无法序列化的问题及解决

    这篇文章主要介绍了@NonNull导致无法序列化的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Java中MyBatis的动态语句详解

    Java中MyBatis的动态语句详解

    这篇文章主要介绍了Java中MyBatis的动态语句详解,动态 SQL 是 MyBatis 的强大特性之一,通过不同参数生成不同的 SQL,可以动态地对数据持久层进行操作,而不需要每个数据访问操作都要进行手动地拼接 SQL 语句,需要的朋友可以参考下
    2023-08-08
  • 关于java编译过程中的bug说明

    关于java编译过程中的bug说明

    本篇文章是对java编译过程中的bug进行了详细的说明介绍,需要的朋友参考下
    2013-05-05
  • Spring中的之启动过程obtainFreshBeanFactory详解

    Spring中的之启动过程obtainFreshBeanFactory详解

    这篇文章主要介绍了Spring中的之启动过程obtainFreshBeanFactory详解,在refresh时,prepareRefresh后,马上就调用了obtainFreshBeanFactory创建beanFactory以及扫描bean信息(beanDefinition),并通过BeanDefinitionRegistry注册到容器中,需要的朋友可以参考下
    2024-02-02
  • Java使用Zxing二维码生成的简单示例

    Java使用Zxing二维码生成的简单示例

    ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库,下面这篇文章主要给大家介绍了关于Java使用Zxing二维码生成的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 微服务之间如何通过feign调用接口上传文件

    微服务之间如何通过feign调用接口上传文件

    这篇文章主要介绍了微服务之间如何通过feign调用接口上传文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot开发实战系列之定时器

    SpringBoot开发实战系列之定时器

    定时任务我想诸位童鞋都不陌生,简而言之名为“设定定时闹钟做某件事情”,下面这篇文章主要给大家介绍了关于SpringBoot定时器的相关资料,需要的朋友可以参考下
    2021-08-08

最新评论