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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。