Java Bean:如何在中生成到Java代码中

例如,我有这个代码:

   

我知道它是如何工作的。 但是,有时候,我在这里更改了一些代码,例如:“dog”到“newDog”,我会遇到错误或未经编辑的结果(和我一起)。

请告诉我如何在Java中生成上面的代码。 (也许只是一个主要想法)

谢谢 :)

JSP最终生成为.java类,它们被编译为servlet。 检查服务器的工作文件夹。 在Tomcat的情况下, /work /org/apache/jsp/test_jsp.java在Tomcat的/work文件夹中生成为/org/apache/jsp/test_jsp.java文件。

以下几行

    

(我做的唯一改变是添加一个包;无包装类是Bad™)

生成为

  com.example.Dog dog = null; synchronized (application) { dog = (com.example.Dog) _jspx_page_context.getAttribute("dog", javax.servlet.jsp.PageContext.APPLICATION_SCOPE); if (dog == null){ dog = new com.example.Dog(); _jspx_page_context.setAttribute("dog", dog, javax.servlet.jsp.PageContext.APPLICATION_SCOPE); out.write("\n"); out.write(" "); org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("dog"), "breed", "House Dog !!!", null, null, false); out.write('\n'); } } 

Tomcat是开源的,根据其源代码, JspRuntimeLibrary#introspecthelper()方法委托给internalIntrospecthelper() ,它最终执行此操作:

 Method method = null; Class type = null; Class propertyEditorClass = null; try { java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean.getClass()); if ( info != null ) { java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors(); for (int i = 0 ; i < pd.length ; i++) { if ( pd[i].getName().equals(prop) ) { method = pd[i].getWriteMethod(); type = pd[i].getPropertyType(); propertyEditorClass = pd[i].getPropertyEditorClass(); break; } } } if ( method != null ) { if (type.isArray()) { if (request == null) { throw new JasperException( Localizer.getMessage("jsp.error.beans.setproperty.noindexset")); } Class t = type.getComponentType(); String[] values = request.getParameterValues(param); //XXX Please check. if(values == null) return; if(t.equals(String.class)) { method.invoke(bean, new Object[] { values }); } else { createTypedArray (prop, bean, method, values, t, propertyEditorClass); } } else { if(value == null || (param != null && value.equals(""))) return; Object oval = convert(prop, value, type, propertyEditorClass); if ( oval != null ) method.invoke(bean, new Object[] { oval }); } } } catch (Exception ex) { Throwable thr = ExceptionUtils.unwrapInvocationTargetException(ex); ExceptionUtils.handleThrowable(thr); throw new JasperException(ex); } 

你看,它使用java.beans.Introspector通过BeanInfo#getPropertyDescriptors()获取bean信息和属性。 所需的方法由PropertyDescriptor#getWriteMethod()java.lang.reflect.Method获得。 最后,它使用Reflection API来调用该方法。

这是它的生成方式:

 Dog dog = new Dog(); dog.setBreed("House Dog !!!"); 

setProperty中的狗是对useBean的Class Dog的引用。 希望你能理解这一点