Java 动态生成类和实例, 并注入方法操作示例
本文实例讲述了Java动态生成类和实例,并注入方法。分享给大家供大家参考,具体如下:
Java官方支持的,必须要有接口才行
importjava.lang.reflect.Constructor; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; importjava.util.LinkedList; importjava.util.List; importjava.util.Random; /** *@authorDavidDing * */ interfaceIJavaGen{ intgetRandomInt(); voidprintClassInfo(); } abstractclassJavaGenimplementsIJavaGen{ protectedListcalledMethods=newLinkedList<>();//property publicintgetRandomInt(){//Getarandominteger returnnewRandom().nextInt(10000); } publicabstractvoidprintClassInfo(); } classJavaGenHandlerimplementsInvocationHandler{ privateJavaGenmTarget; publicJavaGenHandler(JavaGenjavaGen){ mTarget=javaGen; } //动态注入 @Override publicObjectinvoke(Objectobj,Methodmethod,Object[]params)throwsThrowable{ Objectret=null; Stringname=method.getName(); if(name.equals("getRandomInt")){//interceptthegetRandomInt ret=method.invoke(mTarget,params);//callthebasemethod System.out.println("Printrandomint:"+ret); }elseif(name.equals("printClassInfo")){//printclassinfo System.out.println("Class:"+obj.getClass()); method.invoke(mTarget,params); } mTarget.calledMethods.add(name);//changetheproperty returnret; } } publicclassJavaCodeGen{ publicstaticvoidmain(String[]args){ try{ Class>genClass=Proxy.getProxyClass(IJavaGen.class.getClassLoader(),IJavaGen.class); Constructor>cons=genClass.getConstructor(InvocationHandler.class); JavaGentarget=newJavaGen(){ @Override publicvoidprintClassInfo(){ System.out.println("Ihavetoimplementthismethod!!"); } }; IJavaGenjavaGen=(IJavaGen)cons.newInstance(newJavaGenHandler(target)); javaGen.getRandomInt(); javaGen.printClassInfo(); System.out.println(target.calledMethods); }catch(Exceptione){ e.printStackTrace(); } } }
运行结果:
Printrandomint:8143
Class:classdemo.$Proxy0
Ihavetoimplementthismethod!!
[getRandomInt,printClassInfo]
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。