2009-08-20 30 views
5

Tôi có một hàm tạo (đối với một lớp được tạo tự động) có 255 tham số. Sử dụng kiến ​​trên Linux với javac 1.6.0_02. Lớp học biên soạn tốt và mọi thứ đều tốt.Lỗi biên dịch Java: Tham số x vượt quá giới hạn 255 từ

Tuy nhiên khi tôi cố gắng biên dịch cùng lớp từ bên trong nhật thực trên cửa sổ xp với jdk 1.6, tôi nhận được lỗi sau

Too many parameters, parameter BLAH is exceeding the limit of 255 words eligible for method parameters 

BLAH là tham số 256.

Có cách nào để khắc phục sự cố này không? Thay đổi lớp được tạo tự động không phải là một tùy chọn vì tôi sẽ cần phải thay đổi nó mỗi khi biên dịch hoặc thay đổi trình tạo. Cả hai tùy chọn đều không được chấp nhận bởi vì chúng ta đã có thể nhận được lớp này trên Linux.

PS: Đối với những người quan tâm, lớp java được tạo từ tệp IDL sử dụng JacORB. Thật không may là số lượng các tham số trong lớp không thể giảm được vì nó định nghĩa một giao diện giữa phần mềm của chúng ta và các hệ thống khác.

+0

Không có cách nào lol. : o: o –

+0

Tôi rất muốn xem mã tạo ra một thể hiện của lớp đó. –

+0

Đặt cược của tôi là trên đây là một lớp được tạo ra wsdl2java. –

Trả lời

14

Vâng, bạn đang phá vỡ VM specification, section 4.10:

The number of method parameters is limited to 255 by the definition of a method descriptor (§4.3.3), where the limit includes one unit for this in the case of instance or interface method invocations. Note that a method descriptor is defined in terms of a notion of method parameter length in which a parameter of type long or double contributes two units to the length, so parameters of these types further reduce the limit.

tôi đề nghị bạn vượt qua những trở ngại trong việc thay đổi mã được tạo ... Tôi khá ngạc nhiên khi nó hoạt động trên Linux, phải trung thực. Tôi sẽ không được hoàn toàn ngạc nhiên nếu bytecode nó tạo ra là hoàn toàn không hợp lệ, và nó chỉ xảy ra để được làm việc cho bạn vào lúc này.

Mặc dù luôn cố gắng tìm cách giữ mã hiện tại và bỏ qua các giới hạn, tôi nghĩ trong trường hợp này, bạn nên chú ý giảm số lượng tham số ngay lập tức.

+0

@ Jean-FrançoisSavard: Không, có vẻ như có ít nhất 256 tham số - do đó "' BLAH' là tham số 256 "và" tham số BLAH vượt quá giới hạn 255 từ ". Cho rằng, tôi vẫn ngạc nhiên khi nó hoạt động ở bất cứ đâu. –

+0

Bạn nói đúng, tôi cũng ngạc nhiên. –

1

Vâng, class file spec. nói:

A method descriptor is valid only if it represents method parameters with a total length of 255 or less, where that length includes the contribution for this in the case of instance or interface method invocations. The total length is calculated by summing the contributions of the individual parameters, where a parameter of type long or double contributes two units to the length and a parameter of any other type contributes one unit.

2

Có 2 lựa chọn để giải quyết vấn đề này:

  1. Tạo lớp học của bạn không có hoặc một số đối số nhà xây dựng và sau đó thiết lập các thông số còn lại qua setters. Giống như sử dụng mô hình trình xây dựng.
  2. Tạo các lớp đơn giản hơn, mỗi lớp chứa 3 hoặc 4 biến và đặt các đối tượng đơn giản đó thành 1 lớp chính.
Các vấn đề liên quan