Hi,您目前在全站搜索关键字asm ,共找到 9 个内容。
cglib代理指定只代理某个方法importnet.sf.cglib.proxy.*;importjava.lang.reflect.Method;classSampleClass{publicvoidtest(){System.out.println("test");}publicvoidtest2(){System.out.println("test2");}}publicclasstest{publicstaticvoidmain(String[]args){Enhancerenhancer=newEnhancer();enhancer.setSuperclass(SampleClass.class);CallbackHelpercallbackHelper=newCallbackHelper(SampleClass.class,newClass[0]){@OverrideprotectedObjectgetCallback(Methodmethod){//只代理方法名是test的方法if(method.getName().equals("test")){returnnewMethodInterceptor(){@OverridepublicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{System.out.print("代理---");returnmethodProxy.invokeSuper(o,objects);}};}else{returnNoOp.INSTANCE;}}};enhancer.setCallbackFilter(callbackHelper);enhancer.setCallbacks(callbackHelper.getCallbacks());SampleClassproxy=(SampleClass)enhancer.create();proxy.test();proxy.test2();}}输出:代理---testtest2
一、MethodInterceptor二、InvocationHandler三、FixedValue四、ImmutableBean五、BeanGenerator六、BeanMap  关于cglib代理的概念和原理,这里就不多说了,详细请参考以往的博客:初步探究cglib动态代理的原理:http://www.jiajiajia.club/blog/artical/yjw520/134cglib动态代理底层实现分析java:http://www.jiajiajia.club/official/weblog/yjw520/34  本篇主要介绍cglib的主要(常用)的api。一、MethodInterceptor入门的hellowordimportnet.sf.cglib.proxy.*;importjava.lang.reflect.Method;classSampleClass{publicvoidtest(){System.out.println("test");}publicvoidtest2(){System.out.println("test2");}}publicclasstest{publicstaticvoidmain(String[]args){Enhancerenhancer=newEnhancer();enhancer.setSuperclass(SampleClass.class);enhancer.setCallback(newMethodInterceptor(){@OverridepublicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{System.out.println("before");Objectres=methodProxy.invokeSuper(o,objects);System.out.println("after");returnres;}});SampleClassproxy=(SampleClass)enhancer.create();proxy.test();proxy.test2();}}输出:beforetestafterbeforetest2after  该种方法将代理SampleClass类的非final的所有成员方法。如果只想代理某个指定的方法,可以实现CallbackFilter接口,如下:importnet.sf.cglib.proxy.*;importjava.lang.reflect.Method;classSampleClass{publicvoidtest(){System.out.println("test");}publicvoidtest2(){System.out.println("test2");}}publicclasstest{publicstaticvoidmain(String[]args){Enhancerenhancer=newEnhancer();enhancer.setSuperclass(SampleClass.class);CallbackHelpercallbackHelper=newCallbackHelper(SampleClass.class,newClass[0]){@OverrideprotectedObjectgetCallback(Methodmethod){//只代理方法名是test的方法if(method.getName().equals("test")){returnnewMethodInterceptor(){@OverridepublicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{System.out.print("代理---");returnmethodProxy.invokeSuper(o,objects);}};}else{returnNoOp.INSTANCE;}}};enhancer.setCallbackFilter(callbackHelper);enhancer.setCallbacks(callbackHelper.getCallbacks());SampleClassproxy=(SampleClass)enhancer.create();proxy.test();proxy.test2();}}输出:代理---testtest2  这种方法可以指定具体代理某一个方法。二、InvocationHandler  InvocationHandler可以实现对接口的代理,类似与mybatis,代码中开发者只需要写一个接口和一个xml,mybatis会根据xml的描述信息,帮你生成对应的方法实现,参数的解析、sql的生成、发送、结果集的封装等都不用开发者去写。而其中的原理就是利用了代理模式。  首先定义一个接口,这个接口里有各种返回值类型的方法。importjava.util.List;publicinterfaceTestInterface{StringtestString(Integerid);inttestInt(Stringvalue);ListtestList(Integerage,Integerg);SampleClasstestSampleClass();}  用代理模式去实现这些方法。实现类交由cglib去动态创建。importnet.sf.cglib.proxy.*;importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.List;publicclasstest2{publicstaticvoidmain(String[]args){Class[]classes={TestInterface.class};Enhancerenhancer=newEnhancer();enhancer.setInterfaces(classes);CallbackHelpercallbackHelper=newCallbackHelper(Object.class,classes){@OverrideprotectedObjectgetCallback(Methodmethod){//只代理TestInterface中的方法if(method.getDeclaringClass()==TestInterface.class){returnnewInvocationHandler(){@OverridepublicObjectinvoke(Objecto,Methodmethod,Object[]objects)throwsThrowable{System.out.print("参数:");for(Objectobject:objects){System.out.print(object+"\t");}System.out.println();Class?returnType=method.getReturnType();if(returnType==int.class||returnType==Integer.class){//返回值类型是整数类型return1;}elseif(returnType==String.class){//返回值类型是字符串return"string";}elseif(returnType==List.class){//返回值类型是集合ArrayListarrayList=newArrayList();arrayList.add("11");returnarrayList;}//...等等else{//自定义类型returnreturnType.newInstance();}}};}else{//什么都不做returnNoOp.INSTANCE;}}};enhancer.setCallbackFilter(callbackHelper);enhancer.setCallbacks(callbackHelper.getCallbacks());TestInterfaceproxy=(TestInterface)enhancer.create();System.out.println("返回值:"+proxy.testInt("123"));;System.out.println("返回值:"+proxy.testList(1,1));;System.out.println("返回值:"+proxy.testString(1));;System.out.println("返回值:"+proxy.testSampleClass());;}}三、FixedValue  该方法会对所有拦截的方法返回同样的值。importnet.sf.cglib.proxy.*;importjava.lang.reflect.Method;classSampleClass{publicStringtest(){return"test";}publicStringtest2(){return"test2";}}publicclasstest{publicstaticvoidmain(String[]args){Enhancerenhancer=newEnhancer();enhancer.setSuperclass(SampleClass.class);CallbackHelpercallbackHelper=newCallbackHelper(SampleClass.class,newClass[0]){@OverrideprotectedObjectgetCallback(Methodmethod){//只代理返回值类型是String类型的方法,如果返回值类型不是String将会抛异常。if(method.getReturnType()==String.class){returnnewFixedValue(){@OverridepublicObjectloadObject()throwsException{return"proxy...";}};}else{returnNoOp.INSTANCE;}}};enhancer.setCallbackFilter(callbackHelper);enhancer.setCallbacks(callbackHelper.getCallbacks());SampleClassproxy=(SampleClass)enhancer.create();System.out.println(proxy.test());System.out.println(proxy.test2());System.out.println(proxy.toString());System.out.println(proxy.hashCode());}}输出:proxy...proxy...proxy...1874154700返回值是String类型的都返回同样的值。四、ImmutableBean  不可变的Bean。ImmutableBean允许创建一个原来对象的包装类,这个包装类是不可变的,任何改变底层对象的包装类操作都会抛出IllegalStateException。但是我们可以通过直接操作底层对象来改变包装类对象。importnet.sf.cglib.beans.ImmutableBean;classSampleBean{SampleBean(){}SampleBean(intid){this.id=id;}privateintid;publicintgetId(){returnthis.id;}publicvoidsetId(intid){this.id=id;}}publicclasstest2{publicstaticvoidmain(String[]args){SampleBeanbean=newSampleBean();bean.setId(1);SampleBeanimmutableBean=(SampleBean)ImmutableBean.create(bean);System.out.println(bean.getId());System.out.println(immutableBean.getId());bean.setId(2);System.out.println(bean.getId());System.out.println(immutableBean.getId());immutableBean.setId(3);//包装类修改将会抛异常System.out.println(bean.getId());System.out.println(immutableBean.getId());}}输出:1122Exceptioninthread"main"java.lang.IllegalStateException:Beanisimmutableatcom.example.SampleBean$$ImmutableBeanByCGLIB$$e23e512b.setId(generated)atcom.example.test2.main(test2.java:31)五、BeanGenerator  cglib提供的一个操作bean的工具,使用它能够在运行时动态的创建一个bean。importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;publicclasstest2{publicstaticvoidmain(String[]args)throwsNoSuchMethodException,InvocationTargetException,IllegalAccessException{BeanGeneratorbeanGenerator=newBeanGenerator();beanGenerator.addProperty("id",int.class);ObjectmyBean=beanGenerator.create();Methodsetter=myBean.getClass().getMethod("setId",int.class);setter.invoke(myBean,1);Methodgetter=myBean.getClass().getMethod("getId");System.out.println(getter.invoke(myBean));}}动态创建一个类,该类包含一个int类型的id属性,并包含get,set方法。六、BeanMap  BeanMap类实现了JavaMap,将一个bean对象中的所有属性转换为一个String-to-Obejct的JavaMapimportnet.sf.cglib.beans.BeanMap;importjava.lang.reflect.InvocationTargetException;classBean{intid=1;Stringname="name";publicintgetId(){returnthis.id;}publicStringgetName(){returnthis.name;}}publicclasstest2{publicstaticvoidmain(String[]args)throwsNoSuchMethodException,InvocationTargetException,IllegalAccessException{Beanbean=newBean();BeanMapbeanMap=BeanMap.create(bean);Objectid=beanMap.get("id");Objectname=beanMap.get("name");System.out.println(id);System.out.println(name);}}输出:1name
  关于cglib代理的概念和原理以及常用api,请参考:初步探究cglib动态代理的原理:http://www.jiajiajia.club/blog/artical/yjw520/134cglib动态代理底层实现分析java:http://www.jiajiajia.club/official/weblog/yjw520/34cglib代理常用接口和api:http://www.jiajiaj
asm实例对象方法的调用1.需要的jar包2.我们需要通过asm生成的目标类如下:packageclub.jiajia.test3;publicclassExamp5
asm生成for循环语句方法1.jar包2.原java文件packageclub.jiajia.test3;publicclassExamp4{ publicintmethod(inta
asm动态生成类和getandset方法1.自定义类加载器packageclub.jiajia.test;publicclassMyClassLoaderextendsClassLoader
1.jar包:2.原java文件:packageclub.jiajia.test3;publicclassExamp3{ publicintmethod(inta){ switch(a){ case123: a=1230; break; case128: a=1280; break; case12: a=120; break; } returna
1.内部名在许多情况下,一种类型只能是类或接口类型。例如,一个类的超类、由一个类实现的接口,或者由一个方法抛出的异常就不能是基元类型或数组类型,必须是类或接口类型。这些类型在已编译类中用内部名字表示。一个类的内部名就是这个类的完全限定名,其中的点号用斜线代替。例如,String的内部名为java/lang/String。2.类型描述符内部名只能用于类或接口类型。所有其他Java类型,比如字段类型,
不整点广告都不好意思了~
毛泽东
伟大的无产阶级革命家
周恩来
伟大的无产阶级革命家
钱学森
中国著名科学家,空气动力学家
邓稼先
中国科学院院士、核物理学家
圆明园遗址
清朝帝王大型皇家宫苑
神州5号
中国第一艘载人航天飞船
东风26
慑战一体、核常兼备
极大极小值算法
博弈树搜索算法
书山有路勤为径,学海无涯苦作舟。