Phản ánh Java được thực hiện dễ dàng
javacủasự phản xạGiới thiệu lớp tiện ích cho phép bạn dễ dàng sử dụng API.
Sự phản chiếu là gì?
API phản ánhrăng,"java.lang.reflect” bao gồm trong gói,
Đây là API truy xuất thông tin như các trường và phương thức từ các lớp Java.
Các lớp sau đây chủ yếu được sử dụng.
- java.lang.Class
- java.lang.reflect.Constructor
- java.lang.reflect.Method
- java.lang.reflect.Field
sự phản xạBằng cách sử dụng , bạn có thể tạo các lớp hoặc gọi các phương thức mà không cần phải mã hóa chúng trực tiếp.
Bạn có thể tạo một thể hiện của lớp từ một chuỗi hoặc thực thi một phương thức.
Bằng cách viết các định nghĩa về tên lớp và tên phương thức trong các tệp bên ngoài như XML, bạn có thể điều chỉnh linh hoạt ứng dụng theo những thay đổi của môi trường trong thời gian chạy.
Nó cũng là một API rất hiệu quả để xây dựng các ứng dụng có tính linh hoạt cao.
Mục đích phản ánh
sự phản xạthường không được người dùng sử dụng trực tiếp,
Nó được sử dụng rộng rãi trong các ứng dụng web như Struts và các framework như ánh xạ O/R.
Ví dụ: khi tự động đặt dữ liệu đầu vào màn hình web thành thuộc tính JavaBeans,
Nó được sử dụng khi phát hành SQL tự động cập nhật dựa trên các thuộc tính JavaBeans.
Ngoài ra, các chức năng như tải động và đăng ký các phần bổ trợ giúp mở rộng chức năng khi ứng dụng khởi động đều có sẵn.sự phản xạĐiều này có thể dễ dàng đạt được bằng cách sử dụng .
Chạy mẫu
Hãy chạy mẫu và trải nghiệm lập trình giống như framework.
Ở đây chúng tôi sử dụng lớp sausự phản xạTrình bày cách sử dụng đơn giản của tiện ích.
Main.java...Lớp được thực thi
BeanUtil.java...Lớp tiện ích phản chiếu
FreeSoft.java...Được sử dụng như một sự phản ánh trong một lớp đại diện cho phần mềm miễn phí.
●Khi thực hiện bình thường
FreeSoft freeSoft = FreeSoft mới();
freeSoft.setName(“Trò chuyện&Messenger Trò chuyện và Messenger!!”);
freeSoft.showName();
freeSoft.showPrice(0);
●Khi được thực thi bằng cách sử dụng sự phản chiếu
// Tạo một thể hiện của lớp FreeSoft
Đối tượng gọiObject = BeanUtil.newInstance(“FreeSoft”);
// Đặt giá trị trong trường tên.
BeanUtil.setProperty(invokeObject, "tên" , “Trò chuyện&Messenger Trò chuyện và Messenger!!”);
// Thực thi phương thức showName() của FreeSoft.
BeanUtil.invoke(invokeObject, "hiện tên", vô giá trị);
// Thực thi phương thức showPrice() của FreeSoft.
// Nếu phương thức có các đối số, chúng phải được truyền dưới dạng mảng kiểu Đối tượng.
BeanUtil.invoke(invokeObject, "hiển thị giá",Đối tượng mới[]{Số nguyên mới(0)});
●Kết quả thực hiện
Kết quả thực thi đều giống nhau dù trong trường hợp bình thường hay khi sử dụng sự phản chiếu.
Tên phần mềm: Chat&MessengerTrò chuyện và nhắn tin! !
Giá: 0 yên
>>> Khi sử dụng sự phản chiếu
Tên phần mềm: Chat&MessengerTrò chuyện và nhắn tin! !
Giá: 0 yên
Chi tiết phương thức BeanUtil
phiên bản mới
đối tượng tĩnh công cộng phiên bản mới(String className) ném ngoại lệ
- Tạo và trả về một thể hiện từ chuỗi "className".
-
- Thông số:
tên lớp
– Tên lớp đầy đủ- Giá trị trả về:
- Một phiên bản mới của tên lớp đủ điều kiện
- ngoại lệ:
Ngoại lệ
phiên bản mới
đối tượng tĩnh công cộng phiên bản mới(String className, Object[] argObj) ném ngoại lệ
- Tạo và trả về một thể hiện từ chuỗi "className".
-
- Thông số:
tên lớp
– Tên lớp đầy đủargObj
– Đối số hàm tạo- Giá trị trả về:
- Một phiên bản mới của tên lớp đủ điều kiện
- ngoại lệ:
Ngoại lệ
phiên bản mới
đối tượng tĩnh công cộng phiên bản mới(Lớp clazz) ném Ngoại lệ
- Tạo và trả về một thể hiện từ lớp "clazz".
-
- Thông số:
clazz
- lớp học- Giá trị trả về:
- phiên bản mới của clazz
- ngoại lệ:
Ngoại lệ
phiên bản mới
đối tượng tĩnh công cộng phiên bản mới(Class clazz, Object[] argObj) ném Ngoại lệ
- Tạo và trả về một thể hiện từ lớp "clazz".
-
- Thông số:
clazz
- lớp họcargObj
– Đối số hàm tạo- Giá trị trả về:
- phiên bản mới của clazz
- ngoại lệ:
Ngoại lệ
setProperty
khoảng trống tĩnh công cộng setProperty(Đối tượng gọiObject, Tên trường chuỗi, Giá trị đối tượng) ném Ngoại lệ
- Gọi phương thức setter của trường "fieldName" của đối tượng "invokeObject" và lưu giá trị "value".
Nếu không có phương thức setter, giá trị sẽ được đặt trực tiếp vào trường. Tuy nhiên, trong trường hợp này, công cụ sửa đổi truy cập của thuộc tính đích phải ở chế độ công khai.
-
- Thông số:
gọi đối tượng
– Đối tượng thực hiệntên trường
– Tên thuộc tính của đối tượng được thực thigiá trị
– Giá trị cần thiết lập- ngoại lệ:
Ngoại lệ
– Xảy ra ngoại lệ sau.Đưa ra những mục tiêu ngoại lệ
– Nếu phương thức cơ bản ném ra một ngoại lệTruy cập bất hợp phápNgoại lệ
– Đối tượng Method này là Java
Khi kiểm soát truy cập ngôn ngữ được triển khai và không thể truy cập phương thức cơ bảnNoSuchMethodNgoại lệ
– Nếu không tìm thấy phương thức có tên được chỉ định
nhận được tài sản
đối tượng tĩnh công cộng nhận được tài sản(Đối tượng gọiObject, Tên trường chuỗi) ném Ngoại lệ
- Gọi phương thức getter của trường fieldName của đối tượnggọiObject để lấy giá trị.
Nếu không có phương thức getter, giá trị sẽ được lấy trực tiếp từ trường. Tuy nhiên, trong trường hợp này, công cụ sửa đổi truy cập của thuộc tính đích phải ở chế độ công khai. -
- Thông số:
gọi đối tượng
– Đối tượng thực hiệntên trường
– Tên thuộc tính của đối tượng được thực thi- Giá trị trả về:
- Giá trị trả về của phương thức Getter
- ngoại lệ:
Ngoại lệ
– Xảy ra ngoại lệ sau.Đưa ra những mục tiêu ngoại lệ
– Nếu phương thức cơ bản ném ra một ngoại lệTruy cập bất hợp phápNgoại lệ
– Đối tượng Method này là Java
Khi kiểm soát truy cập ngôn ngữ được triển khai và không thể truy cập phương thức cơ bảnNoSuchFieldException
– Nếu không tìm thấy trường có tên được chỉ định
gọi
đối tượng tĩnh công cộng gọi(Đối tượng InvocateObject, String callMethod, Object[] argObjects) ném ra InvocationTargetException, IllegalAccessException, NoSuchMethodException
- Thực thi phương thức "callMethod" của đối tượng "invokeObject".
Nếu có giá trị trả về, nó có thể được lấy dưới dạng Đối tượng. -
- Thông số:
gọi đối tượng
– Đối tượng thực hiệnphương thức gọi
– Tên phương thức được thực thiđối tượng arg
– Nếu có đối số, chuyển chúng dưới dạng mảng đối tượng. Nếu không có đối số, chuyển null.- Giá trị trả về:
- Giá trị trả về khi thực thi "callMethod"
- ngoại lệ:
Đưa ra những mục tiêu ngoại lệ
– Nếu phương thức cơ bản ném ra một ngoại lệTruy cập bất hợp phápNgoại lệ
– Đối tượng Method này là Java
Khi kiểm soát truy cập ngôn ngữ được triển khai và không thể truy cập phương thức cơ bảnNoSuchMethodNgoại lệ
– Nếu không tìm thấy phương thức có tên được chỉ định
phương thức tìm kiếm
phương pháp tĩnh công khai phương thức tìm kiếm(Đối tượng InvocateObject, String callMethod, Object[] argObjects) ném ra ngoại lệ NoSuchMethodException
- Tìm kiếm phương thức 'callMethod' của đối tượng 'invokeObject'.
-
- Thông số:
gọi đối tượng
– Đối tượng thực hiệnphương thức gọi
– Tên phương thức của đối tượng được thực thiđối tượng arg
– Nếu có đối số, chuyển chúng dưới dạng mảng đối tượng. Nếu không có đối số, chuyển null.- Giá trị trả về:
- Đối tượng Phương thức khớp với các điều kiện đối số đã chỉ định
- ngoại lệ:
NoSuchMethodNgoại lệ
– Nếu không tìm thấy phương thức phù hợp hoặc nếu tên là “” hoặc “”
setField
khoảng trống tĩnh công cộng setField(Đối tượng gọiObject, Tên trường chuỗi, Giá trị đối tượng) ném IllegalAccessException, NoSuchFieldException
- Lưu trữ giá trị "giá trị" trong tên trường "fieldName" của đối tượng được thực thi "invokeObject".
-
- Thông số:
gọi đối tượng
– Đối tượng thực hiệntên trường
– Tên trường của đối tượng được thực thigiá trị
– Giá trị cần thiết lập- ngoại lệ:
Truy cập bất hợp phápNgoại lệ
– Trường dựa trên đối tượng được chỉ định (hoặc lớp con hoặc trình triển khai của nó)
không phải là một phiên bản của lớp hoặc giao diện mà nó khai báo hoặc nếu quá trình chuyển đổi hủy gói không thành côngNoSuchFieldException
– Nếu không tìm thấy trường có tên được chỉ định
getField
đối tượng tĩnh công cộng getField(Đối tượng gọiObject, Tên trường chuỗi) ném IllegalAccessException, NoSuchFieldException
- Lấy giá trị của tên trường "fieldName" của đối tượng được thực thi "invokeObject".
-
- Thông số:
gọi đối tượng
– Đối tượng thực hiệntên trường
– Tên trường của đối tượng được thực thi- Giá trị trả về:
- giá trị trả về
- ngoại lệ:
Truy cập bất hợp phápNgoại lệ
– Trường dựa trên đối tượng được chỉ định (hoặc lớp con hoặc trình triển khai của nó)
không phải là một phiên bản của lớp hoặc giao diện mà nó khai báo hoặc nếu quá trình chuyển đổi hủy gói không thành côngNoSuchFieldException
– Nếu không tìm thấy trường có tên được chỉ định
hasField
boolean tĩnh công khai hasField(Đối tượng đối tượng, Tên trường chuỗi) ném Ngoại lệ
- Kiểm tra xem đối tượng 'đối tượng' có khai báo tên trường 'fieldName' hay không.
-
- Thông số:
sự vật
– Đối tượng cần kiểm tratên trường
– Tên trường cần kiểm tra- Giá trị trả về:
- đúng nếu được khai báo
- ngoại lệ:
Ngoại lệ
getAllFields
java.util.TreeSet tĩnh công khai getAllFields(Đối tượng) ném Ngoại lệ
-
- Thông số:
sự vật
–- Giá trị trả về:
- ngoại lệ:
Ngoại lệ
getShortClassName
Chuỗi tĩnh công khai getShortClassName(Đối tượng đối tượng)
- Lấy tên lớp không đủ tiêu chuẩn từ một đối tượng.
-
- Thông số:
sự vật
–- Giá trị trả về:
getShortClassName
Chuỗi tĩnh công khai getShortClassName(Tên lớp chuỗi)
- Lấy tên lớp từ tên đủ điều kiện.
-
- Thông số:
tên lớp
–- Giá trị trả về:
lấy tên trường
Chuỗi tĩnh công khai lấy tên trường(Tên phương thức chuỗi)
- Thay đổi tên trường từ tên phương thức. Phải tuân thủ các quy ước của JavaBeans.
-
- Thông số:
tên phương thức
–- Giá trị trả về:
isClassExist
boolean tĩnh công khai isClassExist(Tên lớp chuỗi)
- Xác minh rằng tên đủ điều kiện "className" là tên lớp hiện có.
-
- Thông số:
tên lớp
–- Giá trị trả về:
getPropertyDescriptors
Bộ mô tả thuộc tính tĩnh công khai[] getPropertyDescriptors(Đối tượng) ném IntrospectionException
- Trả về một Bộ mô tả thuộc tính chứa thông tin đối tượng cho "đối tượng".
-
- Thông số:
sự vật
–- Giá trị trả về:
- ngoại lệ:
java.beans.IntrospectionException
Mã nguồn BeanUtil
/**
* Lớp tiện ích cho phép bạn dễ dàng sử dụng API phản chiếu của Java
*/
lớp công khai BeanUtil {
/** */
chuỗi tĩnh cuối cùng riêng tư GET = “GET”;
/** */
chuỗi tĩnh cuối cùng riêng tư SET = “SET”;
// ————————————————————-『newInstance』
/**
* Tạo và trả về một thể hiện từ chuỗi "className".
* @param className tên lớp đầy đủ
* @return phiên bản mới của tên lớp đủ điều kiện
* @throws Ngoại lệ
*/
đối tượng tĩnh công khai newInstance(String className) ném Ngoại lệ {
thử {
trả về Class.forName(className).newInstance();
} bắt (NoClassDefFoundError e) {
System.err.println(“NoClassDefFoundError : ” + className);
ném e;
}
}
/**
* Tạo và trả về một thể hiện từ chuỗi "className".
* @param className tên lớp đầy đủ
* Đối số hàm tạo @param argObj
* @return phiên bản mới của tên lớp đủ điều kiện
* @throws Ngoại lệ
*/
đối tượng tĩnh công khai newInstance(String className, Object[] argObj)
ném ngoại lệ {
Lớp[] argClass = Lớp mới[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
Trình xây dựng c = Class.forName(className).getConstructor(argClass);
return c.newInstance(argObj);
}
/**
* Tạo và trả về một thể hiện từ lớp 'clazz'.
* @param lớp clazz
* @return phiên bản mới của clazz
* @throws Ngoại lệ
*/
public static Object newInstance(Class clazz) ném Ngoại lệ {
return clazz.newInstance();
}
/**
* Tạo và trả về một thể hiện từ lớp 'clazz'.
* @param lớp clazz
* Đối số hàm tạo @param argObj
* @return phiên bản mới của clazz
* @throws Ngoại lệ
*/
public static Object newInstance(Class clazz, Object[] argObj)
ném ngoại lệ {
Lớp[] argClass = Lớp mới[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
Hàm tạo c = clazz.getConstructor(argClass);
return c.newInstance(argObj);
}
// ---------------------"Phương pháp"
/**
* Phương thức setter của trường “fieldName” của đối tượng “invokeObject”
* Gọi, lưu trữ giá trị 'giá trị'.
* <br>
* Nếu không có phương thức setter, hãy đặt giá trị trực tiếp vào trường.
* Tuy nhiên, trong trường hợp này, công cụ sửa đổi quyền truy cập của thuộc tính đích phải ở chế độ công khai.
* @paramgọiObject Đối tượng sẽ được thực thi
* @param fieldName Tên thuộc tính của đối tượng sẽ được thực thi
* Giá trị giá trị @param cần đặt
* @throws Ngoại lệ Ngoại lệ sau xảy ra.
* @throws InvocationTargetException nếu phương thức cơ bản ném ra một ngoại lệ
* @throws IllegalAccessException Nếu đối tượng Method này là Java
* Khi kiểm soát truy cập ngôn ngữ được triển khai và không thể truy cập phương thức cơ bản
* @throws NoSuchMethodException nếu không tìm thấy phương thức có tên được chỉ định
*/
public static void setProperty(Object gọiObject, String fieldName,
Giá trị đối tượng) ném Ngoại lệ {
thử {
Phương thức phương thức = searchMethod(invokeObject, fieldName, SET);
Lớp [] paramClasses = phương thức.getParameterTypes();
Đối tượng [] valueArray = null;
if (paramClasses[0].isInstance(value)) {
// Không chuyển đổi nếu đối tượng được đặt là lớp con của lớp đối số.
valueArray = Đối tượng mới[] { value };
} khác {
valueArray = Đối tượng mới[] { convObject(value, paramClasses[0]
.getName()) };
}
phương thức.invoke(invokeObject, valueArray);
} bắt (NoSuchMethodException e) {
thử {
// Nếu không có phương thức setter, hãy đặt nó trực tiếp vào trường.
setField(invokeObject, fieldName, value);
} bắt (NoSuchFieldException fe) {
Chuỗi errorMes = “\nClass” + getShortClassName(invokeObject)
+ “is” + “cho trường “” + fieldName + “”\n”
+ “Không có phương thức setter nào có thể truy cập được và.”
+ “Trường “” + Tên trường
+ “” cũng không được công khai. ” + “”;
ném IllegalAccessException mới (errorMes);
}
}
}
/**
* Phương thức Getter của trường fieldName của đối tượnggọiObject
* Nhận giá trị cuộc gọi. <br>
* Nếu không có phương thức getter, giá trị sẽ được lấy trực tiếp từ trường.
* Tuy nhiên, trong trường hợp này, công cụ sửa đổi quyền truy cập của thuộc tính đích phải ở chế độ công khai.
* @paramgọiObject Đối tượng sẽ được thực thi
* @param fieldName Tên thuộc tính của đối tượng sẽ được thực thi
* @return giá trị trả về của phương thức getter
* @throws Ngoại lệ Ngoại lệ sau xảy ra.
* @throws InvocationTargetException nếu phương thức cơ bản ném ra một ngoại lệ
* @throws IllegalAccessException Nếu đối tượng Method này là Java
* Khi kiểm soát truy cập ngôn ngữ được triển khai và không thể truy cập phương thức cơ bản
* @throws NoSuchFieldException nếu không tìm thấy trường có tên được chỉ định
*/
Đối tượng tĩnh công khai getProperty(Đối tượng gọiObject, Tên trường chuỗi)
ném ngoại lệ {
thử {
Phương thức phương thức = searchMethod(invokeObject, fieldName, GET);
phương thức trả về.invoke(invokeObject, null);
} bắt (NoSuchMethodException e) {
trả về getField(invokeObject, fieldName);
}
}
/**
* Thực thi phương thức "callMethod" của đối tượng "invokeObject".
* Nếu có giá trị trả về, nó có thể được lấy dưới dạng loại Đối tượng.
* @paramgọiObject Đối tượng sẽ được thực thi
* @param callMethod Tên phương thức sẽ được thực thi
* @param argObjects Nếu có một đối số, hãy chuyển nó dưới dạng một mảng đối tượng.
* Truyền null nếu không có đối số.
* @return Giá trị trả về khi thực thi "callMethod"
* @throws InvocationTargetException nếu phương thức cơ bản ném ra một ngoại lệ
* @throws IllegalAccessException Nếu đối tượng Method này là Java
* Khi kiểm soát truy cập ngôn ngữ được triển khai và không thể truy cập phương thức cơ bản
* @throws NoSuchMethodException nếu không tìm thấy phương thức có tên được chỉ định
*/
Gọi đối tượng tĩnh công khai (Đối tượng gọiObject, Phương thức gọi chuỗi,
Object[] argObjects) ném InvocationTargetException,
IllegalAccessException, NoSuchMethodException {
Phương thức phương thức = findMethod(invokeObject, callMethod, argObjects);
phương thức trả về.invoke(invokeObject, argObjects);
}
/**
* Tìm kiếm phương thức 'callMethod' của đối tượng 'invokeObject'.
* @paramgọiObject Đối tượng sẽ được thực thi
* @param callMethod Tên phương thức của đối tượng sẽ được thực thi
* @param argObjects Nếu có một đối số, hãy chuyển nó dưới dạng một mảng đối tượng.
* Truyền null nếu không có đối số.
* Đối tượng Phương thức @return khớp với các điều kiện đối số đã chỉ định
* @throws NoSuchMethodException Nếu không tìm thấy phương thức nào phù hợp,
* Hoặc nếu tên là “ " hoặc " "trong trường hợp
*/
Phương thức tĩnh công khai findMethod(Object gọiObject, String callMethod,
Object[] argObjects) ném NoSuchMethodException {
Lớp[] paramClasses = null;
Phương thức [] phương thức =gọiObject.getClass().getMethods();
top: for (int i = 0; i < Method.length; i++) {
if (methods[i].getName().equals(callMethod)) {
nếu (argObjects == null
&& Methods[i].getParameterTypes().length == 0) {
phương thức trả về[i];
}
nếu (argObjects == null) {
Tiếp tục;
}
paramClasses = các phương thức[i].getParameterTypes();
if (paramClasses.length == argObjects.length) {
// Xác thực tất cả các kiểu danh sách tham số và kiểu đối số
for (int j = 0; j < paramClasses.length; j++) {
Lớp paramClass = paramClasses[j];
Đối tượng argObj = argObjects[j];
// Nếu kiểu đối số là nguyên thủy thì đối tượng đối số
// không phải là null và là nguyên thủy
// Nếu là lớp con của Number thì không sao.
nếu (argObj == null) {
Tiếp tục;
}
if (paramClass.isPrimitive()
&& (argObj instanceof Số || argObj
.getClass().isPrimitive())) {
Tiếp tục;
}
if (!paramClass.isInstance(argObj)) {
// Tiến hành phương pháp tiếp theo khi các loại không tương thích với chuyển đổi ngầm định
tiếp tục hàng đầu;
}
}
phương thức trả về[i];
}
}
}
Chuỗi paramLength = (paramClasses != null) ? Số nguyên
.toString(paramClasses.length): “”;
Chuỗi errorMes = getShortClassName(invokeObject) + “phương thức”
+ callMethod + “Không có.” + “[ paramClasses.length ] = ”
+ paramLength + “,[ argObjects.length ] = ” + argObjects.length
+ “”;
ném NoSuchMethodException mới (errorMes);
}
// ----------------------"Cánh đồng"
/**
* Giá trị cho tên trường "fieldName" của đối tượng "invokeObject" sẽ được thực thi
* Lưu trữ "giá trị".
* @paramgọiObject Đối tượng sẽ được thực thi
* @param fieldName Tên trường của đối tượng sẽ được thực thi
* Giá trị giá trị @param cần đặt
* @throws IllegalAccessException Nếu đối tượng được chỉ định là
* trường (hoặc lớp con hoặc người triển khai của nó)
* Nếu nó không phải là một thể hiện của lớp hoặc giao diện, hãy khai báo
* hoặc nếu quá trình chuyển đổi mở gói không thành công
* @throws NoSuchFieldException nếu không tìm thấy trường có tên được chỉ định
*/
public static void setField(Đối tượng gọiObject, Tên trường chuỗi,
Giá trị đối tượng) ném IllegalAccessException, NoSuchFieldException {
Trường trường = searchField(invokeObject, fieldName);
Chuỗi className = field.getType().getName();
Đối tượng convObj = null;
if (field.getType().isInstance(value)) {
convObj = giá trị;
} khác {
convObj = convObject(value, className);
}
field.set(invokeObject, convObj);
}
/**
* Đặt giá trị của tên trường "fieldName" của đối tượng thực thi "invokeObject" thành
* Lấy.
* @paramgọiObject Đối tượng sẽ được thực thi
* @param fieldName Tên trường của đối tượng sẽ được thực thi
* @return giá trị trả về
* @throws IllegalAccessException Nếu đối tượng được chỉ định là
* trường (hoặc lớp con hoặc người triển khai của nó)
* Nếu nó không phải là một thể hiện của lớp hoặc giao diện, hãy khai báo
* hoặc nếu quá trình chuyển đổi mở gói không thành công
* @throws NoSuchFieldException nếu không tìm thấy trường có tên được chỉ định
*/
Đối tượng tĩnh công khai getField(Đối tượng gọiObject, Tên trường chuỗi)
ném IllegalAccessException, NoSuchFieldException {
Trường trường = searchField(invokeObject, fieldName);
return field.get(invokeObject);
}
/**
* Kiểm tra xem đối tượng "object" có khai báo tên trường "fieldName" hay không
* xác nhận.
* Đối tượng @param Đối tượng cần kiểm tra
* @param fieldName Tên trường cần kiểm tra
* @return true nếu được khai báo
* @throws Ngoại lệ
*/
boolean tĩnh công khai hasField(Đối tượng đối tượng, Tên trường chuỗi)
ném ngoại lệ {
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
Chuỗi _fieldName = props[i].getName();
if (fieldName.equals(_fieldName)) {
trả về sự thật;
}
}
trả về sai;
}
/**
*
* Đối tượng @param
* @trở lại
* @throws Ngoại lệ
*/
công khai TreeSet getAllFields(Object object) ném Ngoại lệ {
Trường TreeSet = TreeSet mới();
// Lấy tên thuộc tính từ phương thức
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
Chuỗi fieldName = props[i].getName();
fieldSet.add(fieldName);
}
// Lấy tên thuộc tính từ trường
Trường [] trường = object.getClass().getFields();
for (int i = 0; i < field.length; i++) {
Chuỗi fieldName = field[i].getName();
if (!fieldSet.contains(fieldName)) {
fieldSet.add(fieldName);
}
}
trường trả vềSet;
}
/**
*
* @paramgọiObject Đối tượng sẽ được thực thi
* @param fieldName Tên trường của đối tượng sẽ được thực thi
* @return Các đối tượng được lưu trữ phù hợp với các điều kiện đối số đã chỉ định
* @throws NoSuchFieldException nếu không tìm thấy trường có tên được chỉ định
*/
Trường tìm kiếm tĩnh riêng tưField(Đối tượng gọiObject, Tên trường chuỗi)
ném NoSuchFieldException {
thử {
trả về revevObject.getClass().getField(fieldName);
} bắt (NoSuchFieldException e) {
// Phạm vi này được lấy từ tên cột của bảng
fieldName = checkFieldName(fieldName);
Trường [] trường =gọiObject.getClass().getFields();
for (int i = 0; i < field.length; i++) {
if (fields[i].getName().equalsIgnoreCase(fieldName)) {
trả về các trường[i];
}
}
ném NoSuchFieldException mới (fieldName);
}
}
// ----------------------" người khác "
/**
* Lấy tên lớp không đủ tiêu chuẩn từ một đối tượng.
* Đối tượng @param
* @trở lại
*/
Chuỗi tĩnh công khai getShortClassName(Object object) {
nếu (đối tượng == null) {
trả về “null”;
}
Tên chuỗi = object.getClass().getName();
trả về getShortClassName(name);
}
/**
* Lấy tên lớp từ tên đủ điều kiện.
* @param tên lớp
* @trở lại
*/
chuỗi tĩnh công khai getShortClassName(String className) {
int index = className.lastIndexOf(“.”);
trả về className.substring(index + 1);
}
/**
* Thay đổi tên trường từ tên phương thức. Tuân thủ các quy ước JavaBeans
* là cần thiết.
* @param tên phương thức
* @trở lại
*/
chuỗi tĩnh công khai getFieldName(String MethodName) {
Tên trường chuỗi = null;
if (methodName.startsWith(“is”)) {
fieldName = MethodName.substring(2);
} khác {
fieldName = MethodName.substring(3);
}
fieldName = convString(fieldName, 0, “L”);
trả về tên trường;
}
/**
* Xác minh rằng tên đủ điều kiện "className" là tên lớp hiện có.
* @param tên lớp
* @trở lại
*/
boolean tĩnh công khai isClassExist(String className) {
thử {
Class.forName(className);
trả về sự thật;
} bắt (Ngoại lệ e) {
trả về sai;
}
}
Bản đồ tĩnh cuối cùng riêng tư BeanInfoCache = new HashMap();
/**
* Trả về một Bộ mô tả thuộc tính chứa thông tin đối tượng cho "đối tượng".
* Đối tượng @param
* @trở lại
* @ném IntrospectionException
*/
public static PropertyDescriptor[] getPropertyDescriptors(Đối tượng đối tượng)
ném IntrospectionException {
BeanInfo BeanInfo = (BeanInfo) BeanInfoCache.get(object.getClass());
nếu (beanInfo == null) {
BeanInfo = Introspector.getBeanInfo(object.getClass());
BeanInfoCache.put(object.getClass(), BeanInfo);
}
// BeanInfo BeanInfo = Introspector.getBeanInfo(object.getClass());
trả về BeanInfo.getPropertyDescriptors();
}
// ————————————————————————–
// ————————————————“Phương pháp riêng bên dưới”
// ————————————————————————–
/**
* Tìm kiếm phương thức truy cập cho tên trường đối số dựa trên PropertyDescriptor.
* @paramgọiObject Đối tượng sẽ được thực thi
* @param tên trường tên trường
* @param gõ Phương thức Getter ⇒ Phương thức GET Getter ⇒ SET
* Đối tượng Phương thức @return khớp với các điều kiện đối số đã chỉ định
* @throws NoSuchMethodException Nếu không tìm thấy phương thức nào phù hợp,
* Hoặc nếu tên là “ " hoặc " ”
* trong trường hợp
* @ném IntrospectionException
*/
Phương thức tĩnh riêng tư searchMethod(ObjectgọiObject, String fieldName,
Kiểu chuỗi) ném NoSuchMethodException, IntrospectionException {
Phương thức phương thức = null;
fieldName = checkFieldName(fieldName);
PropertyDescriptor[] props = getPropertyDescriptors(invokeObject);
for (int i = 0; i < props.length; i++) {
Tên chuỗi = props[i].getName();
if (!name.equalsIgnoreCase(fieldName)) {
Tiếp tục;
}
if (type.equals(GET)) {
phương thức = đạo cụ[i].getReadMethod();
} khác {
phương thức = đạo cụ[i].getWriteMethod();
}
if (phương thức == null) {
Tiếp tục;
}
phương thức trả về;
}
// Nếu phương thức này không tồn tại.
ném NoSuchMethodException mới ("Lớp không có phương thức."
+ “(Không phân biệt chữ hoa chữ thường.): ” + type.toLowerCase()
+ convString(fieldName, 0, “U”) + “()”);
}
/**
* Kiểm tra xem đối số fieldName có phải là tên cột hay không; nếu đó là tên cột,
* Chuyển đổi trở lại.
*
* MAIL_ADDRESS ⇒ ĐỊA CHỈ THƯ ↓ địa chỉ thư = địa chỉ thư
* @param fieldName tên trường hoặc tên cột
* @return tên trường
*/
kiểm tra chuỗi tĩnh riêng tưFieldName(String fieldName) {
int index = fieldName.indexOf(“_”);
trong khi (đúng) {
nếu (chỉ mục == -1) {
trả về tên trường;
}
StringBuffer convcloudn = new StringBuffer(fieldName);
convcloudn.deleteCharAt(index);
fieldName = convcloudn.toString();
chỉ mục = fieldName.indexOf(“_”);
}
}
/**
* Chuyển đổi đối tượng cần chuyển đổi, đối tượng, sang kiểu convClassName.
*
* Đối tượng @param Đối tượng được chuyển đổi
* @param convClassName chuỗi lớp loại cần chuyển đổi
* @return đối tượng đã chuyển đổi
*/
Đối tượng tĩnh riêng convObject(Đối tượng đối tượng, Chuỗi convClassName) {
nếu (đối tượng == null) {
// Trả về null khi chuyển đổi sang kiểu nguyên thủy sẽ gây ra lỗi.
// Biến nó thành một trình bao bọc cho 0.
if (convClassName.equals(“int”)) {
trả về Số nguyên mới (0);
} else if (convClassName.equals(“dài”)) {
trả lại Long mới (0);
} khác {
trả về giá trị rỗng;
}
}
if (object.getClass().getName().equals(convClassName)) {
trả lại đối tượng;
}
// ——————————————-『phiên bản đối tượng của chuỗi』
if (đối tượng instanceof String) {
if (convClassName.equals(“java.lang.String”)) {
trả lại đối tượng;
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“dài”)) {
Chuỗi str = (Chuỗi) đối tượng;
nếu (isExist(str)) {
// Sẽ thật tệ nếu bạn không chuyển đổi nó thành BigDecimal một lần
// 1000.00000
BigDecimal big = new BigDecimal(str);
trả về Long mới (big.longValue());
} khác {
// Nếu str là một ký tự shell, đặt giá trị ban đầu thành “0”
trả lại Long mới (0);
}
} else if (convClassName.equals(“java.sql.Date”)) {
trả về đối tượng toSqlDate((String));
} else if (convClassName.equals(“java.sql.Timestamp”)) {
Ngày ngày = đối tượng toSqlDate((String));
trả về Dấu thời gian mới (date.getTime());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
// Nếu str là một ký tự shell, đặt giá trị ban đầu thành “0”
Chuỗi str = (Chuỗi) đối tượng;
nếu (isExist(str)) {
BigDecimal big = new BigDecimal(str);
trả về Số nguyên mới(big.intValue());
} khác {
trả về Số nguyên mới (0);
}
} else if (convClassName.equals(“boolean”)) {
trả về Boolean.valueOf(object.toString());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
Chuỗi temp = ((String) object).trim();
// Nếu temp.length() == 0, việc đặt nó thành null thay vì 0 là an toàn.
if (temp.length() == 0) {
trả về giá trị rỗng;
} khác {
trả về BigDecimal mới (tạm thời);
}
}
ThrowNoSupprt(object, convClassName);
}
// ————————————“ đối tượng instanceof java.sql.Date ”
khác nếu (đối tượng instanceof java.sql.Date) {
if (convClassName.equals(“java.lang.String”)) {
return toStringDate((java.sql.Date) đối tượng, “yyyy/MM/dd”);
} else if (convClassName.equals(“java.sql.Date”)) {
trả lại đối tượng;
} else if (convClassName.equals(“java.sql.Timestamp”)) {
trả về đối tượng Dấu thời gian mới(((Date)).getTime());
}
ThrowNoSupprt(object, convClassName);
}
// —————————————-『phiên bản đối tượng của Dấu thời gian』
khác nếu (đối tượng instanceof Dấu thời gian) {
thời gian dài = ((Dấu thời gian) đối tượng).getTime();
if (convClassName.equals(“java.lang.String”)) {
return toStringDate(time, “yyyy/MM/dd HH:mm:ss”);
} else if (convClassName.equals(“java.sql.Date”)) {
trả về java.sql.Date mới (thời gian);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
trả lại đối tượng;
}
ThrowNoSupprt(object, convClassName);
}
// ——————————————-『thể hiện đối tượng của số nguyên』
khác nếu (đối tượng instanceof Số nguyên) {
if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
trả lại đối tượng;
} else if (convClassName.equals(“java.lang.String”)) {
trả về object.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“dài”)) {
trả về đối tượng Long(((Integer) object).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
trả về đối tượng BigDecimal(((Integer) mới).intValue());
}
ThrowNoSupprt(object, convClassName);
}
// ———————————————『phiên bản đối tượng của Long』
khác nếu (đối tượng instanceof Long) {
if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“dài”)) {
trả lại đối tượng;
} else if (convClassName.equals(“java.lang.String”)) {
trả về object.toString();
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
trả về đối tượng Integer(((Long) object).intValue()); mới
} else if (convClassName.equals(“java.math.BigDecimal”)) {
trả về đối tượng BigDecimal(((Long) mới).longValue());
}
ThrowNoSupprt(object, convClassName);
}
// ——————————————-『phiên bản đối tượng của Double』
khác nếu (đối tượng instanceof Double) {
if (convClassName.equals(“java.lang.String”)) {
// SỐ CỘT(8,0)
// windows oracle > BigDecimal
// Oracle UNIX > Gấp đôi
BigDecimal big = new BigDecimal((Double) object).doubleValue());
int quy mô = big.scale();
nếu (tỷ lệ == 0) {
trả về big.toString();
} khác {
// Không được hỗ trợ nếu cần làm tròn.
ThrowNoSupprt(object, convClassName);
}
}
if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
trả về đối tượng Integer((Double) mới).intValue());
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“dài”)) {
trả về đối tượng Long((Double) mới).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
trả về đối tượng BigDecimal((Double) mới). doubleValue());
}
ThrowNoSupprt(object, convClassName);
}
// —————————————“ đối tượng thể hiện của BigDecimal ”
khác nếu (đối tượng instanceof BigDecimal) {
if (convClassName.equals(“java.lang.String”)) {
trả về object.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“dài”)) {
trả về đối tượng Long((BigDecimal) mới).longValue());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
trả về đối tượng Integer((BigDecimal) mới).intValue());
}
ThrowNoSupprt(object, convClassName);
}
// ——————————————-『đối tượng instanceof byte[]』
khác nếu (đối tượng instanceof byte[]) {
if (convClassName.equals(“java.sql.Blob”)) {
trả lại đối tượng;
}
ThrowNoSupprt(object, convClassName);
}
// —————————————————“ đối tượng là Boolean”
khác nếu (đối tượng instanceof Boolean) {
if (convClassName.equals(“boolean”)) {
trả lại đối tượng;
}
ThrowNoSupprt(object, convClassName);
}
// ————————————————-『đối tượng là boolean[]』
khác nếu (đối tượng instanceof boolean[]) {
if (convClassName.equals(“java.lang.String”)) {
đối tượng boolean[] bs = (boolean[]);
Hỗ trợ StringBuffer = StringBuffer mới(“[“);
for (int i = 0; i < bs.length; i++) {
buff.append(bs[i] + “,”);
}
buff.deleteCharAt(buff.length() – 1);
buff.append(“]”);
trả về buff.toString();
}
ThrowNoSupprt(object, convClassName);
}
ThrowNoSupprt(object, convClassName);
trả về giá trị rỗng;
}
/**
*Ném nếu chuyển đổi không được hỗ trợ.
*
* Đối tượng @param Đối tượng được chuyển đổi
* @param convClassName Loại để chuyển đổi
*/
void tĩnh riêng némNoSupprt(Đối tượng đối tượng, Chuỗi convClassName) {
Chuỗi className = (object != null) ? object.getClass().getName()
: "vô giá trị";
Chuỗi errorMess = “\nViệc xử lý chuyển đổi kiểu cho Đối tượng này chưa được hỗ trợ.\n”
+ ” [ Đối tượng ] = ” + đối tượng + “,[ Loại đối tượng ] = ” + className
+ “,[ ConvertClass ] = ” + convClassName + “”;
ném UnsupportedOperationException mới (errorMess);
}
/**
* Chuyển ký tự ở vị trí [index] của chuỗi [str] thành chữ hoa hoặc chữ thường.
* <p>
* @param str Chuỗi cần đánh giá
* Chỉ mục @param Vị trí được chỉ định
* @param toCase Chuyển đổi sang chữ hoa ⇒ U | u Chuyển đổi sang chữ thường ⇒ L | l
* @return String sau khi chuyển đổi
*/
chuỗi tĩnh riêng tư convString(String str, int index, String toCase) {
if (str == null || str.trim().length() == 0) {
trả về str;
} khác {
Chuỗi temp = str.substring(index, index + 1);
if (toCase.equalsIgnoreCase(“u”)) {
temp = temp.toUpperCase();
} khác {
temp = temp.toLowerCase();
}
StringBuffer tempBuffer = StringBuffer mới(str);
tempBuffer.replace(chỉ mục, chỉ mục + 1, tạm thời);
trả về tempBuffer.toString();
}
}
/**
* Xác minh xem [giá trị] có phải là giá trị hợp lệ hay không.
*
* Giá trị @param Chuỗi cần đánh giá
* @return [true]: Nếu không null và không “”
*/
boolean tĩnh riêng tư isExist(String value) {
if (value != null && value.length() != 0) {
trả về sự thật;
}
trả về sai;
}
/**
* Lớp java.util.Date hoặc lớp con của nó ở định dạng được chỉ định
* Chuyển đổi thành chuỗi.
* @param date Lớp java.util.Date sẽ được chuyển đổi
* @param định dạng được chỉ định mẫu
* @return chuỗi ngày được định dạng
*/
Chuỗi tĩnh riêng tư toStringDate(Ngày ngày, Mẫu chuỗi) {
SimpleDateFormat sdFormat = SimpleDateFormat mới(mẫu);
trả về sdFormat.format(ngày);
}
java.sql.Date tĩnh riêng tư toSqlDate(String strDate) {
Lịch cal = toCalendar(strDate);
trở vềSqlDate(cal);
}
java.sql.Date tĩnh riêng tư toSqlDate(Calendar cal) {
dài l = cal.getTime().getTime();
trả về java.sql.Date(l); mới
}
/**
* Chuyển đổi một giá trị thời gian dài thành một chuỗi theo định dạng đã chỉ định.
* @param time Một giá trị dài biểu thị mili giây của thời gian hiện tại.
* @param định dạng được chỉ định mẫu
* @return chuỗi ngày được định dạng
*/
Chuỗi tĩnh riêng tư toStringDate(thời gian dài, mẫu chuỗi) {
return toStringDate(new Date(time), mẫu);
}
/**
* Chuỗi ⇒ java.sql.Date
*
* Chuyển đổi chuỗi ngày tháng sau thành java.sql.Date
* yyyy/MM/dd HH:mm:ss.SSS yyyy-MM-dd HH:mm:ss.SSS
*
* “20030407” “2003/04/07” “2003-04-07” “2003/04/07 15:20:16” “2003-04-07
* 15:20:16”
* @param strDate
* @trở lại
*/
Lịch tĩnh riêng toCalendar(String strDate) {
strDate = định dạng(strDate);
Lịch cal = Calendar.getInstance();
int yyyy = Integer.parseInt(strDate.substring(0, 4));
int MM = Integer.parseInt(strDate.substring(5, 7));
int dd = Integer.parseInt(strDate.substring(8, 10));
int HH = cal.get(Lịch.HOUR_OF_DAY);
int mm = cal.get(Lịch.PHÚT);
int ss = cal.get(Calendar.SECOND);
int SSS = cal.get(Lịch.MILLISECOND);
cal.clear();
cal.set(yyyy, MM – 1, đ);
int len = strDate.length();
chuyển đổi (len) {
trường hợp 10:
phá vỡ;
trường hợp 16: // yyyy/MM/dd HH:mm
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Lịch.PHÚT, mm);
phá vỡ;
trường hợp 19: // yyyy/MM/dd HH:mm:ss
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
ss = Integer.parseInt(strDate.substring(17, 19));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Lịch.PHÚT, mm);
cal.set(Calendar.SECOND, ss);
phá vỡ;
trường hợp 23: // yyyy/MM/dd HH:mm:ss.SSS
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
ss = Integer.parseInt(strDate.substring(17, 19));
SSS = Integer.parseInt(strDate.substring(20, 23));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Lịch.PHÚT, mm);
cal.set(Calendar.SECOND, ss);
cal.set(Lịch.MILLISECOND, SSS);
phá vỡ;
mặc định:
ném IllegalStateException mới (
“Chuỗi Chuỗi này không thể chuyển đổi thành chuỗi ngày tháng:”
+ strDate);
}
trả lại cal;
}
/**
* Bất kỳ chuỗi ngày nào dưới dạng “yyyy/MM/dd” hoặc “yyyy/MM/dd HH:mm:ss”
* Cố gắng chuyển đổi sang định dạng.
* Ví dụ: 03/1/3 ⇒ 2003/01/03
* @param strDate
* @trở lại
*/
Định dạng chuỗi tĩnh riêng tư (Chuỗi strDate) {
strDate = strDate.trim();
Chuỗi yyyy = null;
Chuỗi MM = null;
Chuỗi dd = null;
Chuỗi HH = null;
Chuỗi mm = null;
Chuỗi ss = null;
Chuỗi SSS = null;
// Nếu thiếu “-” hoặc “/”
if (strDate.indexOf(“/”) == -1 && strDate.indexOf(“-“) == -1) {
if (strDate.length() == 8) {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
return yyyy + “/” + MM + “/” + dd;
} khác {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
HH = strDate.substring(9, 11);
mm = strDate.substring(12, 14);
ss = strDate.substring(15, 17);
return yyyy + “/” + MM + “/” + dd + ” ” + HH + “:” + mm + “:”
+ss;
}
}
Mã thông báo StringTokenizer = StringTokenizer mới(strDate, “_/-:. “);
Kết quả StringBuffer = StringBuffer mới();
for (int i = 0; token.hasMoreTokens(); i++) {
Chuỗi tạm thời = token.nextToken();
chuyển đổi (i) {
trường hợp 0:// phần năm
yyyy = fillString(strDate, temp, “f”, “20”, 4);
result.append(yyyy);
phá vỡ;
trường hợp 1:// phần tháng
MM = fillString(strDate, temp, “f”, “0”, 2);
result.append(“/” + MM);
phá vỡ;
trường hợp 2:// phần ngày
dd = fillString(strDate, temp, “f”, “0”, 2);
result.append(“/” + dd);
phá vỡ;
trường hợp 3:// phần thời gian
HH = fillString(strDate, temp, “f”, “0”, 2);
result.append(” ” + HH);
phá vỡ;
trường hợp 4:// phần phút
mm = fillString(strDate, temp, “f”, “0”, 2);
result.append(“:” + mm);
phá vỡ;
trường hợp 5:// phần thứ hai
ss = fillString(strDate, temp, “f”, “0”, 2);
result.append(“:” + ss);
phá vỡ;
trường hợp 6:// phần mili giây
SSS = fillString(strDate, temp, “b”, “0”, 3);
result.append(“.” + SSS);
phá vỡ;
}
}
trả về result.toString();
}
Chuỗi tĩnh riêng fillString(Chuỗi strDate, Chuỗi str,
Vị trí chuỗi, Chuỗi addStr, int len) {
if (str.length() > len) {
String mes = strDate + “Chuỗi String này không thể chuyển đổi thành chuỗi ngày tháng”;
ném IllegalStateException mới (mes);
}
trả về fillString(str, location, addStr, len);
}
/**
* Thêm chuỗi [addStr] cần thêm vào chuỗi [str] tại [position] trong [len]
* Chèn cho đến khi đầy đủ.
* <p>
* Ví dụ: Chuỗi ss = StringUtil.fillString(“aaa”,”b”,”0″,7); ss ⇒ “aaa0000”
*
* *fillString() chèn cho đến khi len được lấp đầy, nhưng addString() chèn len.
*
* @param str chuỗi mục tiêu
* @param location Chèn trước ⇒ F/f Chèn sau ⇒ B/b
* @param addStr Chuỗi để chèn
* @param len Số chữ số cần bổ sung
* @return Chuỗi sau khi chuyển đổi. [str] là null hoặc bằng chữ trống, [addStr] được đặt thành [len]
* Trả về kết quả đã chèn cho đến khi hài lòng.
*/
chuỗi tĩnh riêng fillString(Chuỗi str, Vị trí chuỗi,
Chuỗi addStr, int len) {
StringBuffer tempBuffer = null;
if (!isExist(str)) {
tempBuffer = StringBuffer mới();
for (int i = 0; i < len; i++) {
tempBuffer.append(addStr);
}
trả về tempBuffer.toString();
} else if (str.length() != len) {
tempBuffer = StringBuffer mới(str);
while (len > tempBuffer.length()) {
if (position.equalsIgnoreCase(“f”)) {
tempBuffer.insert(0, addStr);
} khác {
tempBuffer.append(addStr);
}
}
trả về tempBuffer.toString();
}
trả về str;
}
}