자바 가 일반적인 형식 인 스 턴 스 를 가 져 옵 니 다.
자바 범 형 은 실제 적 으로 많은 결함 이 있 습 니 다. 예 를 들 어 범 형의 유형 을 직접 가 져 올 수 없고 범 형 류 를 가 져 올 수 없습니다.
다음 방식 은 정확 하지 않다.
①. 일반적인 유형 가 져 오기
Class lstUClazz = List.class
② 부분 변수 범 형의 유형 가 져 오기
List listUser = new ArrayList();
Type genType = listUser.getClass().getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType)
{
// User , ,
ParameterizedType parameterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
그러면 어떻게 해야만 일반적인 유형 을 얻 을 수 있 습 니까?
① 진실 한 유형의 존재 가 있어 야 한다.
②. 일반적인 유형 은 명확 하 다. 예 를 들 어 (List 는 명확 하고 List 는 명확 하지 않다)
상기 두 가 지 를 만족 시 키 면 우 리 는 일반적인 유형 을 얻 을 수 있다.
1. 상속 방식 을 통 해 유형 을 명 확 히 한 다음 에 범 형 류 를 얻는다.
public abstract class JdbcDaoSupport {
protected JdbcDaoSupport() {
}
public Class getTempalteType()
{
Class clazz = (Class) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
return clazz;
}
}
public class UserDao extends JdbcDaoSupport {
}
public class Test{
public static void main(String[] args)
{
UserDao dao = new UserDao();
Class clazz = dao.getTemplateType();
System.out.println(clazz.getName()); // xxx.xxx.User
}
}
2. 클래스 속성의 일반적인 유형 가 져 오기
public class Test extends ClassA {
private List list;
private Map map;
/***
* List
*/
public static void testList() throws NoSuchFieldException, SecurityException {
Type t = Test.class.getDeclaredField("list").getGenericType();
if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) {
System.out.print(t1 + ",");
}
System.out.println();
}
}
/***
* Map
*/
public static void testMap() throws NoSuchFieldException, SecurityException {
Type t = Test.class.getDeclaredField("map").getGenericType();
if (ParameterizedType.class.isAssignableFrom(t.getClass())) {
for (Type t1 : ((ParameterizedType) t).getActualTypeArguments()) {
System.out.print(t1 + ",");
}
System.out.println();
}
}
public static void main(String args[]) throws Exception {
System.out.println(">>>>>>>>>>>testList>>>>>>>>>>>");
testList();
System.out.println("<<<<<<<<<<>>>>>>>>>>testMap>>>>>>>>>>>");
testMap();
System.out.println("<<<<<<<<<<>>>>>>>>>>testClassA>>>>>>>>>>>");
new Test().testClassA();
System.out.println("<<<<<<<<<<
3. 부분 변수의 일반적인 유형 가 져 오기
List lst = new ArrayList(){};
Type genType = listUser.getClass().getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType)
{
ParameterizedType parameterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
실제로 우 리 는 범 형 을 얻 을 수 있 는 유형 이 사실상 '계승' 을 한 다 는 것 을 발견 했다.물론 상기 기 교 를 능숙 하 게 활용 할 수 있다 면 많은 일 을 할 수 있다. 예 를 들 어 오픈 소스 프로젝트 인 Gson 중의 TypeToken 은 상기 기 교 를 이용 하여 json 과 복잡 한 유형의 전환 을 실현 하 는 것 이다.
많은 경우 에 Class 는 매개 변수 로 사용 되 는데 우 리 는 팬 형 클래스 를 매개 변수 로 전송 할 수 있 습 니 다.
우 리 는 일반적으로 편 의 를 위해 특정한 종 류 를 정의 하지 않 기 때문에 다음 과 같은 방식 을 사용 해 야 한다.
Class clz = new ArrayList(){}.getClass();
예시
class JsonToObjectUtil {
public static T jsonToObject(Class clz,List jsonList){
Type genType = clz.getClass().getGenericSuperclass();
Class templatClazz = null;
if(ParameterizedType.class.isInstance(genType));
{
ParameterizedType parameterizedType = (ParameterizedType) genType;
templatClazz = (Class) parameterizedType.getActualTypeArguments()[0];
}
List
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다. 본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.