学习Java第一个类--Object

本文介绍了Java中Object类的基本使用,包括toString、clone、equals、hashCode等方法的重写及其实现逻辑。通过示例代码展示了如何正确实现这些方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开始学习Java,首先对Object类做一个大致的了解。

代码如下,基本的方法我都已经覆盖了(除了wait方法,目前还不知道是用来干嘛的。。。后续更新吧)

public class ObjectTest implements Cloneable
{
	private int num;
	
	public ObjectTest()
	{
		this(0);
	}

	public ObjectTest(int i)
	{
		num = i;
	}


	public String toString()
	{
		//将数字转成字符串的几种方法
		String s = new String(""+num);				//1.
		//String s = String.valueOf(num);			//2.
		//String s = new Integer(num).toString();	//3.
		return s;
	}

	/*需要实现Cloneable接口,并处理异常*/
	public Object clone()
	{
		ObjectTest obj = null; 
		try{
			obj = (ObjectTest)super.clone(); 
		}catch(CloneNotSupportedException e)
		{
			e.printStackTrace(); 
		}
		return obj;
	}


	/**
	此方法的实现逻辑较为复杂
	如果不覆盖此方法,那么equals方式默认的实现与==相同
	*/
	public boolean equals(Object obj)
	{

        if(this == obj)  
            return true;

        if(obj == null) 
            return false;  
 
        if(getClass() != obj.getClass())  
            return false;  
      
        ObjectTest other = (ObjectTest)obj;  
       
        return this.num==other.num;
	}

	public int hashCode()
	{
		return 37*num;
	}

	/*这个方法不懂怎么调用*/
	public void	finalize()
	{
		System.out.println("finalize!");
	}


	public static void main(String[] arg)
	{
		ObjectTest obj1 = new ObjectTest(1);
		
		//测试toString方法
		System.out.println(obj1);

		//测试clone方法 
		ObjectTest obj2 = (ObjectTest)obj1.clone();
		System.out.println(obj1);

		//测试equals方法
		if(obj1.equals(obj2))
		{
			System.out.println("Equal!");
		}else{
			System.out.println("Not equal!");
		}
		
		//测试hashcode方式
		System.out.println("obj1 = "+obj1.hashCode());
		System.out.println("obj2 = "+obj2.hashCode());
	
		//测试getClass方法
		Class c = obj1.getClass();
		System.out.println("obj1.getClass() "+c);
		System.out.println("c.getName() "+c.getName());
		System.out.println("c.getSuperclass() "+c.getSuperclass());
		Class[] interfaceclass = c.getInterfaces();
		for(int i=0;i<interfaceclass.length;i++)
		{
			System.out.println("Interfaces "+interfaceclass[i].getName());
		}


	}
}


C:\Users\12527\apache-tomcat-9.0.100\bin\catalina.bat run [2025-05-13 10:55:19,558] 工件 system:war exploded: 正在等待服务器连接以启动工件部署… Using CATALINA_BASE: "C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc" Using CATALINA_HOME: "C:\Users\12527\apache-tomcat-9.0.100" Using CATALINA_TMPDIR: "C:\Users\12527\apache-tomcat-9.0.100\temp" Using JRE_HOME: "C:\Users\12527\.jdks\temurin-22.0.2" Using CLASSPATH: "C:\Users\12527\apache-tomcat-9.0.100\bin\bootstrap.jar;C:\Users\12527\apache-tomcat-9.0.100\bin\tomcat-juli.jar" Using CATALINA_OPTS: "" NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 13-May-2025 10:55:20.722 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/9.0.100 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建: Feb 13 2025 11:29:56 UTC 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号: 9.0.100.0 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称: Windows 11 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本: 10.0 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构: amd64 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量: C:\Users\12527\.jdks\temurin-22.0.2 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本: 22.0.2+9 13-May-2025 10:55:20.724 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商: Eclipse Adoptium 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: C:\Users\12527\apache-tomcat-9.0.100 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.lang=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.io=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.config.file=C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc\conf\logging.properties 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 13-May-2025 10:55:20.725 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote= 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.port=1099 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.ssl=false 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.password.file=C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc\jmxremote.password 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcom.sun.management.jmxremote.access.file=C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc\jmxremote.access 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.rmi.server.hostname=127.0.0.1 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djdk.tls.ephemeralDHKeySize=2048 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dsun.io.useCanonCaches=false 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dignore.endorsed.dirs= 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.base=C:\Users\12527\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\65fada1a-4c68-4c21-b3b6-bcc92846abdc 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Dcatalina.home=C:\Users\12527\apache-tomcat-9.0.100 13-May-2025 10:55:20.726 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数: -Djava.io.tmpdir=C:\Users\12527\apache-tomcat-9.0.100\temp 13-May-2025 10:55:20.729 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.4]加载了基于APR的Apache Tomcat本机库[1.3.1]。 13-May-2025 10:55:20.729 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]、UDS [true]。 13-May-2025 10:55:20.729 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL配置:useAprConnector[false],useOpenSSL[true] 13-May-2025 10:55:20.733 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 3.0.14 4 Jun 2024] 13-May-2025 10:55:20.846 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"] 13-May-2025 10:55:20.857 信息 [main] org.apache.catalina.startup.Catalina.load 服务器在[276]毫秒内初始化 13-May-2025 10:55:20.902 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina] 13-May-2025 10:55:20.902 信息 [main] org.apache.catalina.core.StandardEngine.startInternal 正在启动 Servlet 引擎:[Apache Tomcat/9.0.100] 13-May-2025 10:55:20.911 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"] 13-May-2025 10:55:20.949 信息 [main] org.apache.catalina.startup.Catalina.start [90]毫秒后服务器启动 已连接到服务器 [2025-05-13 10:55:21,189] 工件 system:war exploded: 正在部署工件,请稍候… 13-May-2025 10:55:21.499 警告 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [5.0]。将使用默认版本。 13-May-2025 10:55:21.655 警告 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [5.0]。将使用默认版本。 13-May-2025 10:55:23.948 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[manageApp]时发生异常 java.lang.IllegalStateException: 启动子级时出错 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:603) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1751) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:264) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:803) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:453) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:407) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:264) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:803) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1570) Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/system_war_exploded]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:406) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599) ... 36 more Caused by: java.lang.IllegalStateException: 由于StackOverflower错误,无法完成对web应用程序[/system_war_exploded]的批注的扫描。可能的根本原因包括-Xss的设置过低和非法的循环继承依赖项。正在处理的层次结构是[com.opensymphony.xwork2.interceptor.NoParameters->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object] at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2307) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2247) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2204) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:2177) at org.apache.catalina.startup.ContextConfig.scanWebXmlFragment(ContextConfig.java:2085) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:2065) at org.apache.catalina.startup.ContextConfig.processClasses(ContextConfig.java:1372) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1273) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:973) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:290) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4407) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ... 37 more 13-May-2025 10:55:23.950 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke 调用方法[createStandardContext]时发生异常 javax.management.RuntimeOperationsException: 调用方法[manageApp]时发生异常 at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:274) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:803) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:453) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:407) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:264) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:803) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) [2025-05-13 10:55:23,969] 工件 system:war exploded: 部署工件时出错。请参阅服务器日志了解详细信息。 at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:714) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1570) Caused by: java.lang.IllegalStateException: 启动子级时出错 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:603) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1751) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:264) ... 30 more Caused by: org.apache.catalina.LifecycleException: 无法启动组件[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/system_war_exploded]] at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:406) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:179) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599) ... 36 more Caused by: java.lang.IllegalStateException: 由于StackOverflower错误,无法完成对web应用程序[/system_war_exploded]的批注的扫描。可能的根本原因包括-Xss的设置过低和非法的循环继承依赖项。正在处理的层次结构是[com.opensymphony.xwork2.interceptor.NoParameters->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object->java.lang.Object] at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2307) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2247) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2204) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:2177) at org.apache.catalina.startup.ContextConfig.scanWebXmlFragment(ContextConfig.java:2085) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:2065) at org.apache.catalina.startup.ContextConfig.processClasses(ContextConfig.java:1372) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1273) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:973) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:290) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4407) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) ... 37 more 13-May-2025 10:55:30.932 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [C:\Users\12527\apache-tomcat-9.0.100\webapps\manager] 13-May-2025 10:55:31.244 信息 [Catalina-utility-1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 13-May-2025 10:55:31.278 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[C:\Users\12527\apache-tomcat-9.0.100\webapps\manager]的部署已在[346]毫秒内完成
最新发布
05-14
<think>好的,我现在需要解决用户在Tomcat 9.0.100启动时遇到的java.lang.IllegalStateException错误,具体是由于StackOverflowError导致无法完成对web应用程序的批注扫描。用户提到可能的原因有两个:-Xss设置过低或循环继承依赖项。我需要一步步分析可能的解决方案,并确保回答结构清晰,帮助用户逐步解决问题。 首先,我需要确认StackOverflowError的常见原因。堆栈溢出通常发生在递归调用过深或存在无限循环的情况下。在Tomcat启动时进行注解扫描,可能是因为应用程序中存在循环依赖的注解或之间的循环继承关系。另外,JVM的线程栈大小(-Xss)设置过低也可能导致这个问题,特别是在处理深度递归时。 接下来,我应该分步骤建议用户检查这两个方面。首先调整JVM参数,增加栈大小,如果问题仍然存在,再检查依赖项和注解是否有循环。同时,可能还需要检查第三方库是否有冲突,或者是否有重复的注解配置。 另外,用户可能需要知道如何具体调整Tomcat的JVM参数,比如在catalina.bat或catalina.sh中设置环境变量JAVA_OPTS。此外,检查项目依赖可以使用IDE的依赖分析工具,或者使用Maven的依赖树命令。 需要注意的是,用户使用的是Tomcat 9.0.100,可能需要确认该版本是否存在已知的相关问题,但通常这问题更多出现在应用代码层面。因此,重点应放在应用本身的依赖和配置上。 最后,要确保回答中的步骤清晰,并且给出具体的命令或操作示例,比如设置-Xss为256k或更高,运行mvn dependency:tree来检查依赖等。同时,提醒用户检查注解的使用是否正确,特别是自定义注解是否存在循环引用的情况。</think>针对Tomcat 9启动时因`StackOverflowError`导致的注解扫描失败问题,请按以下步骤排查: ### 一、验证栈内存设置 1. **调整JVM栈大小** 在Tomcat启动脚本`catalina.sh`/`catalina.bat`中添加: ```bash export JAVA_OPTS="-Xss512k" # Linux/macOS set JAVA_OPTS="-Xss512k" # Windows ``` 推荐值范围:`256k-1m`,若问题未解决可逐步增大[^1] 2. **通过IDE直接配置** 在IntelliJ/Eclipse的Tomcat配置中: ```properties -Xss1024k -XX:+UseG1GC ``` ### 二、检测依赖关系 1. **Maven项目检测** ```bash mvn dependency:tree -Dverbose > dependency.txt ``` 重点检查: - 同一库不同版本的冲突 - `javax.annotation`与`jakarta.annotation`的并存 - 循环继承的文件(如A继承B,B继承A) 2. **Java字节码验证** 使用反编译工具检查`WEB-INF/classes`目录: ```bash javap -v YourClass.class | grep "major version" ``` ### 三、注解扫描优化 1. **配置排除扫描路径** 在`context.xml`中添加: ```xml <Context> <JarScanner skipAll="true"/> <JarScannerFilter scanClassPath="false"/> </Context> ``` 2. **特定文件过滤** 创建`META-INF/context.xml`: ```xml <Context> <JarScanner scanAllDirectories="true"> <JarScanFilter defaultPluggabilityScan="false"/> </JarScanner> </Context> ``` ### 四、代码级检查 1. **注解处理器验证** 检查是否存在自定义注解处理器中的递归调用: ```java @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface CustomAnnotation { Class<?> value() default Void.class; // 避免注解属性包含自身型 } ``` 2. **元注解循环检测** 使用ASM工具分析注解依赖: ```java ClassReader reader = new ClassReader(className); AnnotationVisitor av = new AnnotationVisitor(ASM9) { @Override public void visit(String name, Object value) { if (value instanceof String && ((String)value).contains("循环注解名")) { System.err.println("发现循环注解:" + name); } } }; ``` ### 五、环境验证 1. **最小化验证法** 新建空白web项目逐步添加依赖,通过二分法定位问题库 2. **Tomcat日志增强** 在`logging.properties`中增加: ```properties org.apache.catalina.startup.ContextConfig.level = FINE org.apache.jasper.servlet.TldScanner.level = FINEST ``` ### 典型解决方案示例 ```bash # 成功案例组合配置 JAVA_OPTS="-Xss1024k -XX:+HeapDumpOnOutOfMemoryError" CATALINA_OPTS="-Dorg.apache.catalina.startup.ContextConfig.jarsToSkip=*.jar" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值