ASMSupport教程4.8 生成逻辑运算操作

<p>在java中有以下逻辑运算符:</p> <ul> <li>&amp;&amp;:条件与 </li> <li>||:条件或 </li> <li>&amp; : 布尔型的逻辑与 </li> <li>| : 布尔型的逻辑或 </li> <li>^ : 布尔型的逻辑异或 </li> <li>! : 非操作 </li> </ul> <p>那么接下来我们将些段例子来看看各种逻辑运算的效果,并且我们再通过ASMSupport生成这个例子的字节码Class:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:35f1314d-5424-4ebc-a478-76bc1a2750b5" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre class="brush: java; gutter: true; first-line: 1; tab-size: 4; toolbar: true; width: 665px; height: 319px;" style=" width: 665px; height: 319px;overflow: auto;">public static void main(String\[\] args) { // create truth table for &amp;&amp; (conditional AND) operator System.out.printf(&quot;%s\\n%s: %b\\n%s: %b\\n%s: %b\\n%s: %b\\n\\n&quot;, &quot;Conditional AND (&amp;&amp;)&quot;, &quot;false &amp;&amp; false&quot;, (false &amp;&amp; false), &quot;false &amp;&amp; true&quot;, (false &amp;&amp; true), &quot;true &amp;&amp; false&quot;, (true &amp;&amp; false), &quot;true &amp;&amp; true&quot;, (true &amp;&amp; true));
1// create truth table for || (conditional OR) operator 2System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 3 &quot;Conditional OR (||)&quot;, &quot;false || false&quot;, (false || false), 4 &quot;false || true&quot;, (false || true), &quot;true || false&quot;, 5 (true || false), &quot;true || true&quot;, (true || true)); 6 7// create truth table for &amp; (boolean logical AND) operator 8System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 9 &quot;Boolean logical AND (&amp;)&quot;, &quot;false &amp; false&quot;, (false &amp; false), 10 &quot;false &amp; true&quot;, (false &amp; true), &quot;true &amp; false&quot;, (true &amp; false), 11 &quot;true &amp; true&quot;, (true &amp; true)); 12 13// create truth table for | (boolean logical inclusive OR) operator 14System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 15 &quot;Boolean logical inclusive OR (|)&quot;, &quot;false | false&quot;, 16 (false | false), &quot;false | true&quot;, (false | true), 17 &quot;true | false&quot;, (true | false), &quot;true | true&quot;, (true | true)); 18 19// create truth table for ^ (boolean logical exclusive OR) operator 20System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 21 &quot;Boolean logical exclusive OR (^)&quot;, &quot;false ^ false&quot;, 22 (false ^ false), &quot;false ^ true&quot;, (false ^ true), 23 &quot;true ^ false&quot;, (true ^ false), &quot;true ^ true&quot;, (true ^ true)); 24 25// create truth table for ! (logical negation) operator 26System.out.printf(&quot;%s\n%s: %b\n%s: %b\n&quot;, &quot;Logical NOT (!)&quot;, &quot;!false&quot;, 27 (!false), &quot;!true&quot;, (!true));

}</pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>

<p>我们接下来使用ASMSupport如何生成上面的代码:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:b9a8e603-65ce-4ad8-ba7e-9bddb231310a" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre class="brush: java; gutter: true; first-line: 1; tab-size: 4; toolbar: true; width: 665px; height: 319px;" style=" width: 665px; height: 319px;overflow: auto;">package example.operators;

import org.objectweb.asm.Opcodes;

import jw.asmsupport.block.method.common.StaticMethodBody; import jw.asmsupport.clazz.AClass; import jw.asmsupport.clazz.AClassFactory; import jw.asmsupport.creator.ClassCreator; import jw.asmsupport.definition.value.Value; import jw.asmsupport.definition.variable.LocalVariable;

import example.AbstractExample;

public class LogicalOperatorGenerate extends AbstractExample {

1public static void main(String[] args) { 2 //willGenerate(args); 3 ClassCreator creator = new ClassCreator(Opcodes.V1_5, 4 Opcodes.ACC_PUBLIC, 5 &quot;generated.operators.LogicalOperatorGenerateExample&quot;, null, 6 null); 7 8 9 creator.createStaticMethod(&quot;main&quot;, new AClass[] { AClassFactory.getProductClass(String[].class) }, new String[] { &quot;args&quot; }, null, null, Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, new StaticMethodBody() { 10 11 @Override 12 public void generateBody(LocalVariable... argus) { 13 /*System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 14 &quot;Conditional AND (&amp;&amp;)&quot;, &quot;false &amp;&amp; false&quot;, (false &amp;&amp; false), 15 &quot;false &amp;&amp; true&quot;, (false &amp;&amp; true), &quot;true &amp;&amp; false&quot;, 16 (true &amp;&amp; false), &quot;true &amp;&amp; true&quot;, (true &amp;&amp; true));*/ 17 invoke(systemOut, &quot;printf&quot;, 18 Value.value(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;), 19 Value.value(&quot;Conditional AND (&amp;&amp;)&quot;), 20 Value.value(&quot;false &amp;&amp; false&quot;), 21 conditionalAnd(Value.value(false), Value.value(false)), 22 Value.value(&quot;false &amp;&amp; true&quot;), 23 conditionalAnd(Value.value(false), Value.value(true)), 24 Value.value(&quot;true &amp;&amp; false&quot;), 25 conditionalAnd(Value.value(true), Value.value(false)), 26 Value.value(&quot;true &amp;&amp; true&quot;), 27 conditionalAnd(Value.value(true), Value.value(true)) 28 ); 29 30 /*System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 31 &quot;Conditional OR (||)&quot;, &quot;false || false&quot;, (false || false), 32 &quot;false || true&quot;, (false || true), &quot;true || false&quot;, 33 (true || false), &quot;true || true&quot;, (true || true));*/ 34 invoke(systemOut, &quot;printf&quot;, 35 Value.value(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;), 36 Value.value(&quot;Conditional OR (||)&quot;), 37 Value.value(&quot;false || false&quot;), conditionalOr(Value.value(false), Value.value(false)), 38 Value.value(&quot;false || true&quot;), conditionalOr(Value.value(false), Value.value(true)), 39 Value.value(&quot;true || false&quot;), conditionalOr(Value.value(true), Value.value(false)), 40 Value.value(&quot;true || true&quot;), conditionalOr(Value.value(true), Value.value(true)) 41 ); 42 43 /*System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 44 &quot;Boolean logical AND (&amp;)&quot;, &quot;false &amp; false&quot;, (false &amp; false), 45 &quot;false &amp; true&quot;, (false &amp; true), &quot;true &amp; false&quot;, (true &amp; false), 46 &quot;true &amp; true&quot;, (true &amp; true));*/ 47 invoke(systemOut, &quot;printf&quot;, 48 Value.value(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;), 49 Value.value(&quot;Boolean logical AND (&amp;)&quot;), 50 Value.value(&quot;false &amp; false&quot;), logicalAnd(Value.value(false), Value.value(false)), 51 Value.value(&quot;false &amp; true&quot;), logicalAnd(Value.value(false), Value.value(true)), 52 Value.value(&quot;true &amp; false&quot;), logicalAnd(Value.value(true), Value.value(false)), 53 Value.value(&quot;true &amp; true&quot;), logicalAnd(Value.value(true), Value.value(true)) 54 ); 55 56 /*System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 57 &quot;Boolean logical inclusive OR (|)&quot;, &quot;false | false&quot;, 58 (false | false), &quot;false | true&quot;, (false | true), 59 &quot;true | false&quot;, (true | false), &quot;true | true&quot;, (true | true));*/ 60 invoke(systemOut, &quot;printf&quot;, 61 Value.value(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;), 62 Value.value(&quot;Boolean logical inclusive OR (|)&quot;), 63 Value.value(&quot;false | false&quot;), logicalOr(Value.value(false), Value.value(false)), 64 Value.value(&quot;false | true&quot;), logicalOr(Value.value(false), Value.value(true)), 65 Value.value(&quot;true | false&quot;), logicalOr(Value.value(true), Value.value(false)), 66 Value.value(&quot;true | true&quot;), logicalOr(Value.value(true), Value.value(true)) 67 ); 68 69 /*System.out.printf(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;, 70 &quot;Boolean logical exclusive OR (^)&quot;, &quot;false ^ false&quot;, 71 (false ^ false), &quot;false ^ true&quot;, (false ^ true), 72 &quot;true ^ false&quot;, (true ^ false), &quot;true ^ true&quot;, (true ^ true));*/ 73 invoke(systemOut, &quot;printf&quot;, 74 Value.value(&quot;%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n&quot;), 75 Value.value(&quot;Boolean logical exclusive OR (^)&quot;), 76 Value.value(&quot;false ^ false&quot;), logicalXor(Value.value(false), Value.value(false)), 77 Value.value(&quot;false ^ true&quot;), logicalXor(Value.value(false), Value.value(true)), 78 Value.value(&quot;true ^ false&quot;), logicalXor(Value.value(true), Value.value(false)), 79 Value.value(&quot;true ^ true&quot;), logicalXor(Value.value(true), Value.value(true)) 80 ); 81 82 /*System.out.printf(&quot;%s\n%s: %b\n%s: %b\n&quot;, &quot;Logical NOT (!)&quot;, &quot;!false&quot;, 83 (!false), &quot;!true&quot;, (!true));*/ 84 invoke(systemOut, &quot;printf&quot;, 85 Value.value(&quot;%s\n%s: %b\n%s: %b\n&quot;), 86 Value.value(&quot;Logical NOT (!)&quot;), 87 Value.value(&quot;!false&quot;), not(Value.value(false)), 88 Value.value(&quot;!true&quot;), not(Value.value(true)) 89 ); 90 91 runReturn(); 92 } 93 }); 94 generate(creator); 95}

} </pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div>

<p>我们在每段ASMSupport的代码上分别用注释说明了这段代码生成的内容是什么,我们就不对其进行详细的解说,在这只说明下这些逻辑运算符所对应的asmsupport方法,这些方法都是存在与jw.asmsupport.block.ProgramBlock类中:</p> <ul> <li><font color="#f79646"><strong>public ShortCircuitAnd conditionalAnd(Parameterized factor1, Parameterized factor2) :</strong></font> 条件与(&amp;&amp;)操作 </li> <li><font color="#f79646"><strong>public ShortCircuitOr conditionalOr(Parameterized factor1, Parameterized factor2) :</strong></font> 条件或(||)操作 </li> <li><font color="#f79646"><strong>public LogicalAnd logicalAnd(Parameterized factor1, Parameterized factor2) :</strong></font> 逻辑与(&amp;)操作 </li> <li><strong><font color="#f79646">public LogicalOr logicalOr(Parameterized factor1, Parameterized factor2) :</font></strong> 逻辑或(|)操作 </li> <li><font color="#f79646"><strong>public LogicalXor logicalXor(Parameterized factor1, Parameterized factor2) :</strong></font> 逻辑异或(^)操作 </li> <li><strong><font color="#f79646">public Not not(Parameterized factor) :</font></strong> 非(!)操作 </li> </ul> <p>&#160;</p> <p>以上除了not方法都有两个参数,分别表示运算符前后的两个参数。比如a&amp;&amp;b,那么factor1表示a,factor2表示b, 至于not方法,其效果就是!factor的效果。</p> <p><a href="http://www.wensiqun.com/download/118/">更多实例下载</a></p>
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

LinkWeChat 基于企业微信的SCRM私域流量开源系统

LinkWeChat(https://gitee.com/LinkWeChat/linkwechat"LinkWeChat")平台介绍LinkWeChat(https://gitee.com/Li

PHP安全性防范方式

<h2SQL注入</h2<pSQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。</p<h4防范方式</h4<ul<li使用mysql\_real\_escape\_string(),或者addslashes()过滤数据</li<li手动检查每一数据是否为正确的数据类型</li<li使用

Activiti 工作流入门指南

<divclass"htmledit\_views"id"content\_views"<h1<aname"t0"</a概览</h1<p如我们的介绍部分所述,Activiti目前分为两大类:</p<ul<li<p<ahref"https://activiti.gitbook.io/activiti7deve

mysql 5.7 windows zip安装

<ol<limysql官网下载windowszip安装包并解压(D:wampmysql56winx64)</li<li添加pathD:wampmysql5722winx64bin</li<li创建data目录D:\\wamp\\mysql56winx64\\data</li<li<p创建mysql配置文

ASMSupport教程4.11 生成数组操作

<p在任何语言里,数组都是基本的数据类型,我们这一节将讲述如何生成数组操作。</p<p数组操作包括以下几个:</p<ol<li创建数组</li<li获取数组长度</li<li获取数组每个元素的内容</li<li为数组元素赋值</li</ol<p我们接下来对每种操作进行详解。</p<h3<fonts