diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
index b02ce2e..f806f37 100644
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
+++ b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -130,7 +130,7 @@
 			} else {
 				if (token.equals("\"")) { //$NON-NLS-1$
 					// test if we have something like -Dproperty="value"
-					if (result.size() > 0) {
+					if (!result.isEmpty()) {
 						int index = result.size() - 1;
 						String last = result.get(index);
 						if (last.charAt(last.length() - 1) == '=') {
@@ -239,8 +239,8 @@
 			basicConfigure(classInternalAntRunner, runner);
 
 			// get the info for each targets
-			Method getTargets = classInternalAntRunner.getMethod("getTargets", (Class[]) null); //$NON-NLS-1$
-			Object results = getTargets.invoke(runner, (Object[]) null);
+			Method getTargets = classInternalAntRunner.getMethod("getTargets"); //$NON-NLS-1$
+			Object results = getTargets.invoke(runner);
 			// collect the info into target objects
 			List<?> infos = (List<?>) results;
 			TargetInfo[] targetInfo = new TargetInfo[infos.size()];
@@ -250,12 +250,7 @@
 			}
 			return targetInfo;
 		}
-		catch (NoClassDefFoundError e) {
-			problemLoadingClass(e);
-			// not possible to reach this line
-			return new TargetInfo[0];
-		}
-		catch (ClassNotFoundException e) {
+		catch (NoClassDefFoundError | ClassNotFoundException e) {
 			problemLoadingClass(e);
 			// not possible to reach this line
 			return new TargetInfo[0];
@@ -275,12 +270,12 @@
 	}
 
 	private void basicConfigure(Class<?> classInternalAntRunner, Object runner) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
-		Method setBuildFileLocation = classInternalAntRunner.getMethod("setBuildFileLocation", new Class[] { String.class }); //$NON-NLS-1$
-		setBuildFileLocation.invoke(runner, new Object[] { buildFileLocation });
+		Method setBuildFileLocation = classInternalAntRunner.getMethod("setBuildFileLocation", String.class); //$NON-NLS-1$
+		setBuildFileLocation.invoke(runner, buildFileLocation);
 
 		if (antHome != null) {
-			Method setAntHome = classInternalAntRunner.getMethod("setAntHome", new Class[] { String.class }); //$NON-NLS-1$
-			setAntHome.invoke(runner, new Object[] { antHome });
+			Method setAntHome = classInternalAntRunner.getMethod("setAntHome", String.class); //$NON-NLS-1$
+			setAntHome.invoke(runner, antHome);
 		}
 
 		setProperties(runner, classInternalAntRunner);
@@ -319,8 +314,8 @@
 			classInternalAntRunner = getInternalAntRunner();
 			runner = classInternalAntRunner.getConstructor().newInstance();
 			// set build file
-			Method setBuildFileLocation = classInternalAntRunner.getMethod("setBuildFileLocation", new Class[] { String.class }); //$NON-NLS-1$
-			setBuildFileLocation.invoke(runner, new Object[] { buildFileLocation });
+			Method setBuildFileLocation = classInternalAntRunner.getMethod("setBuildFileLocation", String.class); //$NON-NLS-1$
+			setBuildFileLocation.invoke(runner, buildFileLocation);
 
 			// set the custom classpath
 			if (customClasspath != null) {
@@ -330,8 +325,8 @@
 
 			// add listeners
 			if (buildListeners != null) {
-				Method addBuildListeners = classInternalAntRunner.getMethod("addBuildListeners", new Class[] { List.class }); //$NON-NLS-1$
-				addBuildListeners.invoke(runner, new Object[] { buildListeners });
+				Method addBuildListeners = classInternalAntRunner.getMethod("addBuildListeners", List.class); //$NON-NLS-1$
+				addBuildListeners.invoke(runner, buildListeners);
 			}
 
 			if (buildLoggerClassName == null) {
@@ -339,13 +334,13 @@
 				buildLoggerClassName = IAntCoreConstants.EMPTY_STRING;
 			}
 			// add build logger
-			Method addBuildLogger = classInternalAntRunner.getMethod("addBuildLogger", new Class[] { String.class }); //$NON-NLS-1$
-			addBuildLogger.invoke(runner, new Object[] { buildLoggerClassName });
+			Method addBuildLogger = classInternalAntRunner.getMethod("addBuildLogger", String.class); //$NON-NLS-1$
+			addBuildLogger.invoke(runner, buildLoggerClassName);
 
 			if (inputHandlerClassName != null) {
 				// add the input handler
-				Method setInputHandler = classInternalAntRunner.getMethod("setInputHandler", new Class[] { String.class }); //$NON-NLS-1$
-				setInputHandler.invoke(runner, new Object[] { inputHandlerClassName });
+				Method setInputHandler = classInternalAntRunner.getMethod("setInputHandler", String.class); //$NON-NLS-1$
+				setInputHandler.invoke(runner, inputHandlerClassName);
 			}
 
 			basicConfigure(classInternalAntRunner, runner);
@@ -353,14 +348,14 @@
 			// add progress monitor
 			if (monitor != null) {
 				progressMonitor = monitor;
-				Method setProgressMonitor = classInternalAntRunner.getMethod("setProgressMonitor", new Class[] { IProgressMonitor.class }); //$NON-NLS-1$
-				setProgressMonitor.invoke(runner, new Object[] { monitor });
+				Method setProgressMonitor = classInternalAntRunner.getMethod("setProgressMonitor", IProgressMonitor.class); //$NON-NLS-1$
+				setProgressMonitor.invoke(runner, monitor);
 			}
 
 			// set message output level
 			if (messageOutputLevel != 2) { // changed from the default Project.MSG_INFO
-				Method setMessageOutputLevel = classInternalAntRunner.getMethod("setMessageOutputLevel", new Class[] { int.class }); //$NON-NLS-1$
-				setMessageOutputLevel.invoke(runner, new Object[] { Integer.valueOf(messageOutputLevel) });
+				Method setMessageOutputLevel = classInternalAntRunner.getMethod("setMessageOutputLevel", int.class); //$NON-NLS-1$
+				setMessageOutputLevel.invoke(runner, Integer.valueOf(messageOutputLevel));
 			}
 
 			// set execution targets
@@ -370,13 +365,10 @@
 			}
 
 			// run
-			Method run = classInternalAntRunner.getMethod("run", (Class[]) null); //$NON-NLS-1$
-			run.invoke(runner, (Object[]) null);
+			Method run = classInternalAntRunner.getMethod("run"); //$NON-NLS-1$
+			run.invoke(runner);
 		}
-		catch (NoClassDefFoundError e) {
-			problemLoadingClass(e);
-		}
-		catch (ClassNotFoundException e) {
+		catch (NoClassDefFoundError | ClassNotFoundException e) {
 			problemLoadingClass(e);
 		}
 		catch (InvocationTargetException e) {
@@ -402,8 +394,8 @@
 	private void setProperties(Object runner, Class<?> classInternalAntRunner) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
 		// add properties
 		if (userProperties != null) {
-			Method addUserProperties = classInternalAntRunner.getMethod("addUserProperties", new Class[] { Map.class }); //$NON-NLS-1$
-			addUserProperties.invoke(runner, new Object[] { userProperties });
+			Method addUserProperties = classInternalAntRunner.getMethod("addUserProperties", Map.class); //$NON-NLS-1$
+			addUserProperties.invoke(runner, userProperties);
 		}
 
 		// add property files
@@ -426,8 +418,8 @@
 		String message = null;
 		if (runner != null) {
 			try {
-				Method getBuildErrorMessage = classInternalAntRunner.getMethod("getBuildExceptionErrorMessage", new Class[] { Throwable.class }); //$NON-NLS-1$
-				message = (String) getBuildErrorMessage.invoke(runner, new Object[] { realException });
+				Method getBuildErrorMessage = classInternalAntRunner.getMethod("getBuildExceptionErrorMessage", Throwable.class); //$NON-NLS-1$
+				message = (String) getBuildErrorMessage.invoke(runner, realException);
 			}
 			catch (Exception ex) {
 				// do nothing as already in error state
@@ -510,8 +502,8 @@
 			Thread.currentThread().setContextClassLoader(loader);
 			Class<?> classInternalAntRunner = loader.loadClass("org.eclipse.ant.internal.core.ant.InternalAntRunner"); //$NON-NLS-1$
 			Object runner = classInternalAntRunner.getConstructor().newInstance();
-			Method run = classInternalAntRunner.getMethod("run", new Class[] { Object.class }); //$NON-NLS-1$
-			run.invoke(runner, new Object[] { argArray });
+			Method run = classInternalAntRunner.getMethod("run", Object.class); //$NON-NLS-1$
+			run.invoke(runner, argArray);
 		}
 		finally {
 			Thread.currentThread().setContextClassLoader(originalClassLoader);
diff --git a/ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java b/ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java
index d402563..0c55ce0 100644
--- a/ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java
+++ b/ant/org.eclipse.ant.tests.ui/test plugin/org/eclipse/ant/tests/ui/testplugin/AbstractAntUITest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- *  Copyright (c) 2003, 2013 IBM Corporation and others.
+ *  Copyright (c) 2003, 2021 IBM Corporation and others.
  *
  *  This program and the accompanying materials
  *  are made available under the terms of the Eclipse Public License 2.0
@@ -7,7 +7,7 @@
  *  https://www.eclipse.org/legal/epl-2.0/
  *
  *  SPDX-License-Identifier: EPL-2.0
- * 
+ *
  *  Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -88,7 +88,7 @@
 
 	/**
 	 * Constructor
-	 * 
+	 *
 	 * @param name
 	 */
 	public AbstractAntUITest(String name) {
@@ -97,7 +97,7 @@
 
 	/**
 	 * Returns the {@link IFile} for the given build file name
-	 * 
+	 *
 	 * @param buildFileName
 	 * @return the associated {@link IFile} for the given build file name
 	 */
@@ -107,7 +107,7 @@
 
 	/**
 	 * Returns the {@link File} for the given build file name
-	 * 
+	 *
 	 * @param buildFileName
 	 * @return the {@link File} for the given build file name
 	 */
@@ -119,7 +119,7 @@
 
 	/**
 	 * When a test throws the 'try again' exception, try it again.
-	 * 
+	 *
 	 * @see junit.framework.TestCase#runBare()
 	 */
 	@Override
@@ -151,7 +151,7 @@
 
 	/**
 	 * Ensure the welcome screen is closed because in 4.x the debug perspective opens a giant fast-view causing issues
-	 * 
+	 *
 	 * @throws Exception
 	 * @since 3.8
 	 */
@@ -182,9 +182,9 @@
 
 	/**
 	 * Asserts that the testing project has been setup in the test workspace
-	 * 
+	 *
 	 * @throws Exception
-	 * 
+	 *
 	 * @since 3.5
 	 */
 	public static void assertProject() throws Exception {
@@ -226,7 +226,7 @@
 
 	/**
 	 * Returns the 'AntUITests' project.
-	 * 
+	 *
 	 * @return the test project
 	 */
 	protected static IProject getProject() {
@@ -235,7 +235,7 @@
 
 	/**
 	 * Returns the underlying {@link IDocument} for the given file name
-	 * 
+	 *
 	 * @param fileName
 	 * @return the underlying {@link IDocument} for the given file name
 	 */
@@ -254,7 +254,7 @@
 
 	/**
 	 * Returns the contents of the given {@link InputStream} as a {@link String}
-	 * 
+	 *
 	 * @param inputStream
 	 * @return the {@link InputStream} as a {@link String}
 	 */
@@ -274,7 +274,7 @@
 
 	/**
 	 * Returns the contents of the given {@link BufferedReader} as a {@link String}
-	 * 
+	 *
 	 * @param bufferedReader
 	 * @return the contents of the given {@link BufferedReader} as a {@link String}
 	 */
@@ -298,7 +298,7 @@
 
 	/**
 	 * Returns the contents of the given {@link BufferedReader} as a {@link String}
-	 * 
+	 *
 	 * @param bufferedReader
 	 * @return the contents of the given {@link BufferedReader} as a {@link String}
 	 */
@@ -325,7 +325,7 @@
 
 	/**
 	 * Returns the {@link AntModel} for the given file name
-	 * 
+	 *
 	 * @param fileName
 	 * @return the {@link AntModel} for the given file name
 	 */
@@ -345,7 +345,7 @@
 
 	/**
 	 * Allows the current {@link IDocument} context to be set. This method accepts <code>null</code>
-	 * 
+	 *
 	 * @param currentDocument
 	 */
 	public void setCurrentDocument(IDocument currentDocument) {
@@ -354,7 +354,7 @@
 
 	/**
 	 * Launches the Ant build with the build file name (no extension).
-	 * 
+	 *
 	 * @param buildFileName
 	 *            the ant build file name
 	 */
@@ -366,7 +366,7 @@
 
 	/**
 	 * Launches the Ant build with the build file name (no extension).
-	 * 
+	 *
 	 * @param buildFileName
 	 *            the build file
 	 * @param arguments
@@ -382,7 +382,7 @@
 
 	/**
 	 * Launches the Ant build in debug output mode with the build file name (no extension).
-	 * 
+	 *
 	 * @param buildFileName
 	 *            build file to launch
 	 * @return thread in which the first suspend event occurred
@@ -397,7 +397,7 @@
 
 	/**
 	 * Returns the launch configuration for the given build file
-	 * 
+	 *
 	 * @param buildFileName
 	 *            build file to launch
 	 * @see ProjectCreationDecorator
@@ -439,7 +439,7 @@
 
 	/**
 	 * Parses the given input stream with the given parser using the given handler
-	 * 
+	 *
 	 * @param stream
 	 * @param parser
 	 * @param handler
@@ -458,7 +458,7 @@
 
 	/**
 	 * Returns the launch manager
-	 * 
+	 *
 	 * @return launch manager
 	 */
 	public static ILaunchManager getLaunchManager() {
@@ -467,7 +467,7 @@
 
 	/**
 	 * Returns the 'AntUITests' project.
-	 * 
+	 *
 	 * @return the test project
 	 */
 	public static IJavaProject getJavaProject() {
@@ -476,7 +476,7 @@
 
 	/**
 	 * Launches the given configuration and waits for the terminated event or the length of the given timeout, whichever comes first
-	 * 
+	 *
 	 * @param config
 	 * @param timeout
 	 * @throws CoreException
@@ -495,7 +495,7 @@
 	/**
 	 * Launches the given configuration and waits for an event. Returns the source of the event. If the event is not received, the launch is
 	 * terminated and an exception is thrown.
-	 * 
+	 *
 	 * @param configuration
 	 *            the configuration to launch
 	 * @param waiter
@@ -528,7 +528,7 @@
 	/**
 	 * Returns the {@link IHyperlink} at the given offset on the given document, or <code>null</code> if there is no {@link IHyperlink} at that offset
 	 * on the document.
-	 * 
+	 *
 	 * @param offset
 	 * @param doc
 	 * @return the {@link IHyperlink} at the given offset on the given document or <code>null</code>
@@ -555,7 +555,7 @@
 	/**
 	 * Returns the {@link Color} at the given offset on the given document, or <code>null</code> if there is no {@link Color} at that offset on the
 	 * document.
-	 * 
+	 *
 	 * @param offset
 	 * @param document
 	 * @return the {@link Color} at the given offset on the given document or <code>null</code>
@@ -577,7 +577,7 @@
 	/**
 	 * This is to help in increasing the test coverage by enabling access to fields and execution of methods irrespective of their Java language
 	 * access permissions.
-	 * 
+	 *
 	 * More accessor methods can be added to this on a need basis
 	 */
 	protected static abstract class TypeProxy {
@@ -590,7 +590,7 @@
 
 		/**
 		 * Gets the method with the given method name and argument types.
-		 * 
+		 *
 		 * @param methodName
 		 *            the method name
 		 * @param types
@@ -602,10 +602,7 @@
 			try {
 				method = master.getClass().getDeclaredMethod(methodName, types);
 			}
-			catch (SecurityException e) {
-				fail();
-			}
-			catch (NoSuchMethodException ex) {
+			catch (SecurityException | NoSuchMethodException e) {
 				fail();
 			}
 			Assert.isNotNull(method);
@@ -615,7 +612,7 @@
 
 		/**
 		 * Invokes the given method with the given arguments.
-		 * 
+		 *
 		 * @param method
 		 *            the given method
 		 * @param arguments
@@ -626,13 +623,7 @@
 			try {
 				return method.invoke(master, arguments);
 			}
-			catch (IllegalArgumentException e) {
-				fail();
-			}
-			catch (InvocationTargetException e) {
-				fail();
-			}
-			catch (IllegalAccessException e) {
+			catch (IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
 				fail();
 			}
 			return null;
