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程序设计有所帮助。

(0)

相关推荐

  • java 利用java反射机制动态加载类的简单实现

    如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

  • Java的Spring框架中bean的继承与内部bean的注入

    bean的定义继承 bean定义可以包含很多的配置信息,包括构造函数的参数,属性值,比如初始化方法,静态工厂方法名等容器的具体信息. 子bean定义从父定义继承配置数据.子的定义可以覆盖一些值,或者根据需要添加其他. Spring bean定义继承无关,与Java类的继承,但继承的概念是一样的.你可以定义一个父bean定义为模板和其他孩子bean可以从父bean继承所需的配置. 当使用基于XML的配置元数据,指明一个子bean定义使用所在的当前属性指定的父bean作为这个属性的值. 例如: 让我

  • Java实现动态创建类操作示例

    本文实例讲述了Java实现动态创建类操作.分享给大家供大家参考,具体如下: Java可以创建动态类,学习看到,此处作为笔记. 代码如下: import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.tools.Java

  • 详解Java的MyBatis框架与Spring框架整合中的映射器注入

    MyBatis-Spring允许你在Service Bean中注入映射器.当使用映射器时,就像调用DAO那样来调用映射器就可以了,但是此时你就不需要进行任何DAO实现的编码,因为MyBatis会为你进行. 使用注入的映射器,你的代码就不会出现任何MyBatis-Spring依赖和MyBatis依赖.在我们的应用中有这样一个简单的映射器.你也应该知道映射器仅仅是一个接口: public interface UserMapper { User getUser(String userId); } 这是

  • Java动态调用类中方法代码

    在Java中,调用类的方法有两种方式:对于静态方法可以直接使用类名调用,对于非静态方法必须使用类的对象调用.反射机制提供了比较另类的调用方式,可以根据需要指定要调用的方法,而不必在编程时确定.调用的方法不仅限于public的,还可以是private的.编写程序,使用反射机制调用Math类的静态方法sin()和非静态方法equals(). 思路如下:使用Math.class.getDeclaredMethod("sin", Double.TYPE);访问指定的方法,其中"sin

  • Java动态获取实现某个接口下所有的实现类对象集合

    最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这个接口,就能自动被加载执行.话不多说,说说我的实现方案. 开始想着用反射自己写一个工具类,后面懒得去折腾,就直接用第三方工具包了,这里我用的是org.reflections. maven配置: <dependency> <groupId>org.reflections</groupId> <artifactId>

  • Java实现的properties文件动态修改并自动保存工具类

    本文实例讲述了Java实现的properties文件动态修改并自动保存工具类.分享给大家供大家参考,具体如下: 一.概述 利用commons-configuration读取配置文件,并实现对配置文件的动态修改和自动保存. Apache Common-Configuration工具可以从 Properties文件,XML文件,JNDI,JDBC数据源,System Properties,Applet parameters,Servlet Parameters等读取相应信息 使用步骤 前提,引入co

  • 详解Java Spring各种依赖注入注解的区别

    注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Component. Autowired是自动注入,自动从spring的上下文找到合适的bean来注入 Resource用来指定名称注入 Qualifier和Autowired配合使用,指定bean的名称 Service,Controller,Repository分别标记类是Service层类,Contro

  • 详解Java多态对象的类型转换与动态绑定

    Java多态对象的类型转换 这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常. 在继承链中,我们将子类向父类转换称为"向上转型",将父类向子类转换称为"向下转型". 很多时候,我们会将变量定义为父类的类型,却引用子类的对象,这个过程就是向上转型.程序运行时通过动态绑定来实现对子类方法的调用,也就是多态性. 然而有些时候

  • Java 创建动态类和查看方法列表信息的实例

     Java 创建动态类和查看方法列表信息的实例 Sample code : import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.Type; import java.util.ArrayList; import

随机推荐