Nếu tôi có một lớp Activity được gọi là TestActivity trong ứng dụng của mình, có cách nào để lấy lớp của nó theo tên của nó như trong ví dụ này không:
Class<?> c = getClassByName("TestActivity");
Câu trả lời:
sử dụng forName để thay thế ..
một cái gì đó như thế này ..
try {
Class<?> act = Class.forName("com.bla.TestActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class<? extends SomeClass>
?
Bạn có thể sử dụng Class::forName
để lấy một đối tượng lớp không xác định. Nếu bạn muốn nhận một lớp đã nhập, bạn có thể sử dụng Class::asSubclass
lớp được trả về bởi Class::forName
:
Class<? extends Activity> activityClass = Class.forName("com.example.TestActivity")
.asSubclass(Activity.class);
Tất nhiên bạn cũng sẽ phải xử lý một loạt các loại ngoại lệ khác nhau. Như thường lệ khi xử lý phản ánh.
Các Class.forName dường như có trường hợp ngoại lệ trên đó. Đây chỉ là mở rộng ở trên để giải quyết vấn đề này.
try { t = Class.forName("com.package.classname"); } catch (Exception ignored){}
Tôi cũng có một yêu cầu tương tự, tôi có một json đến từ phần phụ trợ có chứa màn hình và ánh xạ hoạt động. Vì json chung cho cả iOS / Android, chúng tôi không thể thêm các thuật ngữ như Activity
json, vì vậy đây là những gì chúng tôi đã làm
Trong json cho tất cả Activity
hoặc Viewcontrollers
, sử dụng các tên đơn giản, nghĩa là cho HomeActivity
và HomeViewController
chúng tôi sẽ sử dụng "Home" trong json
Trong ứng dụng, chúng tôi phân tích cú pháp json và tôi đã viết các phương thức tiện ích bên dưới để nhận hoạt động một cách linh hoạt
Để lấy tên của lớp (tức là nếu chúng ta vượt qua Trang chủ, chúng ta sẽ quay lại com.package.HomeActivity
)
fun getClassInfoFor(name: String, context: Context):String{
var str = "${context.getPackageName()}.${name}Activity"
return str
}
Bây giờ để lấy lớp từ chuỗi
try {
val className = Utilties.getClassInfoFor(activityNameFromJSON, context)
val fetchedClass = Class.forName(className)
val showDetailsIntent = Intent(context, fetchedClass)
context.startActivity(showDetailsIntent)
} catch (e: ClassNotFoundException) {
e.printStackTrace()
}
Bằng cách này, tôi có thể dễ dàng quản lý nhiều lớp với cùng một phương pháp. Tôi sử dụng điều này trong chế độ xem tái chế, nơi mọi tế bào của tôi điều hướng đến một hoạt động khác nhau.