There are so many efficient ways to do it but to make you understand i am gonna modify your own code
public int[] reverse3(int[] nums) {
      int[] nums2 = new int[3];
      for (int i = nums.length - 1; i >= 0; i--) {
         for (int j = (nums.length-1) - i; j < nums.length; j++) {
              nums2[j] = nums[i];
        }
      }
      return nums2;
    }
or let's do a a little bit modification rather than using nums.length() again and again we can put it inside a variable
public int[] reverse3(int[] nums) {
      int[] nums2 = new int[3];
      int length = nums.length;
      for (int i = length - 1; i >= 0; i--) {
         for (int j = (length-1) - i; j < length; j++) {
              nums2[j] = nums[i];
        }
      }
      return nums2;
    }
Remember it is not an efficient way but to make you understand i just modify the logic. Using nested loops like that will decrease the performance so better avoid it and try to do it in much more optimized way..