iteye_13460 2010-02-03 17:52
浏览 241
已采纳

native的实现?

通过调试,
我struts的action的方法里调用
request.getParameter方法,应该是调用的servlet api 中的
org.apache.catalina.connector.RequestFacade 类的重载的getParameter方法,
public String getParameter(String name) {

    if (request == null) {
        throw new IllegalStateException(
                        sm.getString("requestFacade.nullRequest"));
    }

    if (Globals.IS_SECURITY_ENABLED){
        return (String)AccessController.doPrivileged(
            new GetParameterPrivilegedAction(name));
    } else {
        return request.getParameter(name);
    }
}

然后,上面调用的
return (String)AccessController.doPrivileged(
new GetParameterPrivilegedAction(name));
可我发现doPriviledged是native的,我就不知道tomcat目录下哪个文件里实现的native方法的了....

public static native T doPrivileged(PrivilegedAction action);

  • 写回答

1条回答 默认 最新

  • rednaxelafx 2010-02-04 00:38
    关注

    这个是Java标准库中的类的native实现,跟Tomcat没关系。如果你用的是Sun的JVM的话,源码是在j2se\src\share\native\java\security\AccessController.c
    [code="c"]/*

    • Class: java_security_AccessController
    • Method: doPrivileged
    • Signature: (Ljava/security/PrivilegedAction;)Ljava/lang/Object;
      */
      JNIEXPORT jobject JNICALL Java_java_security_AccessController_doPrivileged__Ljava_security_PrivilegedAction_2
      (JNIEnv *env, jclass cls, jobject action)
      {
      return JVM_DoPrivileged(env, cls, action, NULL, JNI_FALSE);
      }[/code]
      hotspot\src\share\vm\prims\jvm.cpp
      [code="c++"]JVM_ENTRY(jobject, JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException))
      JVMWrapper("JVM_DoPrivileged");

      if (action == NULL) {
      THROW_MSG_0(vmSymbols::java_lang_NullPointerException(), "Null action");
      }

      // Stack allocated list of privileged stack elements
      PrivilegedElement pi;

      // Check that action object understands "Object run()"
      Handle object (THREAD, JNIHandles::resolve(action));

      // get run() method
      methodOop m_oop = Klass::cast(object->klass())->uncached_lookup_method(
      vmSymbols::run_method_name(),
      vmSymbols::void_object_signature());
      methodHandle m (THREAD, m_oop);
      if (m.is_null() || !m->is_method() || !methodOop(m())->is_public() || methodOop(m())->is_static()) {
      THROW_MSG_0(vmSymbols::java_lang_InternalError(), "No run method");
      }

      // Compute the frame initiating the do privileged operation and setup the privileged stack
      vframeStream vfst(thread);
      vfst.security_get_caller_frame(1);

      if (!vfst.at_end()) {
      pi.initialize(&vfst, JNIHandles::resolve(context), thread->privileged_stack_top(), CHECK_NULL);
      thread->set_privileged_stack_top(&pi);
      }

      // invoke the Object run() in the action object. We cannot use call_interface here, since the static type
      // is not really known - it is either java.security.PrivilegedAction or java.security.PrivilegedExceptionAction
      Handle pending_exception;
      JavaValue result(T_OBJECT);
      JavaCallArguments args(object);
      JavaCalls::call(&result, m, &args, THREAD);

      // done with action, remove ourselves from the list
      if (!vfst.at_end()) {
      assert(thread->privileged_stack_top() != NULL && thread->privileged_stack_top() == &pi, "wrong top element");
      thread->set_privileged_stack_top(thread->privileged_stack_top()->next());
      }

      if (HAS_PENDING_EXCEPTION) {
      pending_exception = Handle(THREAD, PENDING_EXCEPTION);
      CLEAR_PENDING_EXCEPTION;

      if ( pending_exception->is_a(SystemDictionary::exception_klass()) &&
      !pending_exception->is_a(SystemDictionary::runtime_exception_klass())) {
      // Throw a java.security.PrivilegedActionException(Exception e) exception
      JavaCallArguments args(pending_exception);
      THROW_ARG_0(vmSymbolHandles::java_security_PrivilegedActionException(),
      vmSymbolHandles::exception_void_signature(),
      &args);
      }
      }

      if (pending_exception.not_null()) THROW_OOP_0(pending_exception());
      return JNIHandles::make_local(env, (oop) result.get_jobject());
      JVM_END[/code]
      这些源码可以从Sun的官网获取,http://download.java.net/jdk6/source/ ,也可以下载OpenJDK版,http://download.java.net/openjdk/jdk6/

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真