Java 动态生成类和实例, 并注入方法
2016-12-29 16:29
323 查看
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! fuck!"); } }; IJavaGen javaGen = (IJavaGen) cons.newInstance(new JavaGenHandler(target)); javaGen.getRandomInt(); javaGen.printClassInfo(); System.out.println(target.calledMethods); } catch (Exception e) { e.printStackTrace(); } } }
相关文章推荐
- 关于动态生成WML文件的一个Java实例(3)
- Java 反射机制运用实例(动态调用类的方法)
- 动态生成java文件的方法
- Java图片裁剪和生成缩略图的实例方法
- 生成随机数方法:java.util.Random.nextInt(int n)方法实例
- 关于动态生成WML文件的一个Java实例(4)
- 不修改源代码,动态注入Java代码的方法
- Java中动态生成代理的方法
- java动态生成实例笔记<持续更新中>
- Java运行时动态生成class的方法
- 动态生成java文件的方法
- 四种动态生成Java代码的方法(一)
- java随机动态生成汉字验证码图片的实例代码分享
- java动态方法调度实例分析
- 关于动态生成WML文件的一个Java实例(2)
- 四种动态生成Java代码的方法【转】
- 实现poi方式生成excel文件和web类根据路径生成java实例的反射技术的springmvc方法的方法
- 四种动态生成Java代码的方法(二)
- Java反射根据不同方法名动态调用不同的方法(实例)
- java随机动态生成汉字验证码图片的实例代码分享