Pfeffer 2017-08-04 11:23 采纳率: 50%
浏览 1285
已结题

instanceof()的源码在哪,我找半天没找到

1.我在源文件src和api里面都找不到,这是怎么回事呢,还是说他属于哪个类呢?
2.一般api有两种搜索,一种是index,另一种是find 这两种分别是搜索什么呢?

  • 写回答

1条回答 默认 最新

  • qq_39699014 2017-08-04 12:46
    关注

    /*

    • Javassist, a Java-bytecode translator toolkit.
    • Copyright (C) 1999- Shigeru Chiba. All Rights Reserved. *
    • The contents of this file are subject to the Mozilla Public License Version
    • 1.1 (the "License"); you may not use this file except in compliance with
    • the License. Alternatively, the contents of this file may be used under
    • the terms of the GNU Lesser General Public License Version 2.1 or later,
    • or the Apache License Version 2.0. *
    • Software distributed under the License is distributed on an "AS IS" basis,
    • WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
    • for the specific language governing rights and limitations under the
    • License. */

    package javassist.expr;

    import javassist.*;
    import javassist.bytecode.*;
    import javassist.compiler.*;
    import javassist.compiler.ast.ASTList;

    /**

    • Instanceof operator.
      /
      public class Instanceof extends Expr {
      /
      *

      • Undocumented constructor. Do not use; internal-use only. */ protected Instanceof(int pos, CodeIterator i, CtClass declaring, MethodInfo m) { super(pos, i, declaring, m); }

      /**

      • Returns the method or constructor containing the instanceof
      • expression represented by this object. */ public CtBehavior where() { return super.where(); }

      /**

      • Returns the line number of the source line containing the
      • instanceof expression. *
      • @return -1 if this information is not available. */ public int getLineNumber() { return super.getLineNumber(); }

      /**

      • Returns the source file containing the
      • instanceof expression. *
      • @return null if this information is not available. */ public String getFileName() { return super.getFileName(); }

      /**

      • Returns the CtClass object representing
      • the type name on the right hand side
      • of the instanceof operator. */ public CtClass getType() throws NotFoundException { ConstPool cp = getConstPool(); int pos = currentPos; int index = iterator.u16bitAt(pos + 1); String name = cp.getClassInfo(index); return thisClass.getClassPool().getCtClass(name); }

      /**

      • Returns the list of exceptions that the expression may throw.
      • This list includes both the exceptions that the try-catch statements
      • including the expression can catch and the exceptions that
      • the throws declaration allows the method to throw. */ public CtClass[] mayThrow() { return super.mayThrow(); }

      /**

      • Replaces the instanceof operator with the bytecode derived from
      • the given source text. *
      • $0 is available but the value is null. *

      • @param statement a Java statement except try-catch.
        */
        public void replace(String statement) throws CannotCompileException {
        thisClass.getClassFile(); // to call checkModify().
        ConstPool constPool = getConstPool();
        int pos = currentPos;
        int index = iterator.u16bitAt(pos + 1);

        Javac jc = new Javac(thisClass);
        ClassPool cp = thisClass.getClassPool();
        CodeAttribute ca = iterator.get();

        try {
        CtClass[] params
        = new CtClass[] { cp.get(javaLangObject) };
        CtClass retType = CtClass.booleanType;

        int paramVar = ca.getMaxLocals();
        jc.recordParams(javaLangObject, params, true, paramVar,
                        withinStatic());
        int retVar = jc.recordReturnType(retType, true);
        jc.recordProceed(new ProceedForInstanceof(index));
        
        // because $type is not the return type...
        jc.recordType(getType());
        
        /* Is $_ included in the source code?
         */
        checkResultValue(retType, statement);
        
        Bytecode bytecode = jc.getBytecode();
        storeStack(params, true, paramVar, bytecode);
        jc.recordLocalVariables(ca, pos);
        
        bytecode.addConstZero(retType);
        bytecode.addStore(retVar, retType);     // initialize $_
        
        jc.compileStmnt(statement);
        bytecode.addLoad(retVar, retType);
        
        replace0(pos, bytecode, 3);
        

        }
        catch (CompileError e) { throw new CannotCompileException(e); }
        catch (NotFoundException e) { throw new CannotCompileException(e); }
        catch (BadBytecode e) {
        throw new CannotCompileException("broken method");
        }
        }

      /* boolean $proceed(Object obj)
      */
      static class ProceedForInstanceof implements ProceedHandler {
      int index;

      ProceedForInstanceof(int i) {
          index = i;
      }
      
      public void doit(JvstCodeGen gen, Bytecode bytecode, ASTList args)
          throws CompileError
      {
          if (gen.getMethodArgsLength(args) != 1)
              throw new CompileError(Javac.proceedName
                      + "() cannot take more than one parameter "
                      + "for instanceof");
      
          gen.atMethodArgs(args, new int[1], new int[1], new String[1]);
          bytecode.addOpcode(Opcode.INSTANCEOF);
          bytecode.addIndex(index);
          gen.setType(CtClass.booleanType);
      }
      
      public void setReturnType(JvstTypeChecker c, ASTList args)
          throws CompileError
      {
          c.atMethodArgs(args, new int[1], new int[1], new String[1]);
          c.setType(CtClass.booleanType);
      }
      

      }
      }

    评论

报告相同问题?

悬赏问题

  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号